<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook V4.1//EN">

<book id="lwce20010827" lang="de">

  <bookinfo>
    <title>LTSP - Linux Terminal Server Project - v3.0</title>

    <authorgroup>
        <author>
           <firstname>James</firstname>
           <surname>McQuillan</surname>
           <affiliation>
              <address><email>jam@LTSP.org</email>
              </address>
           </affiliation>
        </author>
        <othercredit>
           <firstname>Martin</firstname>
           <surname>Herweg</surname>
           <affiliation>
              <address><email>m.herweg@gmx.de</email>
              </address>
           </affiliation>
        </othercredit>
        <othercredit>
           <firstname>Wolfgang</firstname>
           <surname>Schweer</surname>
           <affiliation>
              <address><email>schweer@cityweb.de</email>
              </address>
           </affiliation>
        </othercredit>
    </authorgroup>

    <revhistory>
       <revision>
         <revnumber>1.0.4&nbsp;</revnumber>
         <date>2002-03-02</date>
         <authorinitials>jam</authorinitials>
       </revision>
       <revision>
         <revnumber>1.0.4-de&nbsp;</revnumber>
         <date>2. März 2002</date>
         <authorinitials>ws</authorinitials>
       </revision>
    </revhistory>

    <copyright>
        <year>2002</year>
        <holder>James A. McQuillan für die englischsprachige Originalfassung</holder>
    </copyright>
    <copyright>
        <year>2002</year>
        <holder>Martin Herweg und Wolfgang Schweer für die deutschsprachige Fassung</holder>
    </copyright>

    <abstract>
       <para>
           GNU/Linux bietet eine gute Grundlage für den Einsatz von plattenlosen
	   "thin clients".
           In erster Linie soll dieses Dokument zeigen, wie plattenlose 
	   "thin clients" mit LTSP eingerichtet und betrieben werden können.
	   Es werden allerdings auch viele Aspekte zum Thema plattenlose 
	   Arbeitsplatzrechner im Allgemeinen behandelt.
       </para>
    </abstract>
  </bookinfo>

<preface>
    <title>Einführung</title>
    <para>
        Das LTS-Projekt ermöglicht es, auf einfache Weise preisgünstige 
	Arbeitsplatzrechner als Terminals eines GNU/Linux-Servers zu benutzen -
	mit einer graphischen Oberfläche oder textbasiert.
	 
    </para>

    <para>
	In einer klassischen Büroumgebung finden sich auf jedem Schreibtisch
	relativ gut ausgestattete PCs, jeder mit eigener Festplatte von mehreren
	Gigabytes. Die Benutzer speichern ihre Daten lokal, Backups werden selten
	bis nie durchgeführt.
    </para>

    <para>
	Macht es wirklich Sinn, auf jedem Schreibtisch solch einen Rechner stehen zu haben?
    </para>

    <para>
	Unsere Antwort lautet: Nein.
    </para>

    <para>
	Glücklicherweise gibt es eine Alternative. Wenn man LTSP benutzt, dann
	reichen PCs am unteren Ende der Preisskala - Festplatte, Diskettenlaufwerk und 
	CDROM-Laufwerk sind überflüssig. Lediglich eine Netzwerkkarte, von der der Rechner
	gebootet werden kann, ist notwendig. Viele Netzwerkkarten haben einen Bootrom-Sockel.
    </para>

    <para>
	Während der Bootphase erhält der plattenlose Client seine IP-Adresse,
	weitere Informationen und den Kernel vom Server. Danach wird das Root-Verzeichnis 
	vom Server per NFS gemountet.
    </para>

    <para>
	Der Client kann auf drei Weisen konfiguriert werden:
        <itemizedlist>
            <listitem>
                <para><command>Graphische Oberfläche - X Window</command></para>
                <para>
                    Unter dem X Window System kann der Arbeitsplatzrechner alle Anwendungsprogramme auf dem
		    Server oder auf anderen Servern im Netzwerk benutzen. 
                </para>
            </listitem>
        </itemizedlist>

        <itemizedlist>
            <listitem>
                <para><command>Textbasiert: Telnet-Sitzungen</command></para>
                <para>
		    Der Arbeitsplatzrechner kann bis zu 9 Telnet-Sitzungen zum
		    Server aufbauen. Jede Sitzung läuft auf einer virtuellen Konsole.
		    Mit ALT-F1 bis ALT-F9 kann zwischen den einzelnen Konsolen hin- und her
		    geschaltet werden.
                </para>
            </listitem>
        </itemizedlist>

        <itemizedlist>
            <listitem>
                <para><command>Textbasiert: Shell-Modus</command></para>
                <para>
		    Der Client hat nach Voreinstellung auf den beiden ersten
		    Konsolen eine bash. Man ist bereits als root angemeldet - 
		    nützlich, wenn es Probleme mit dem Start der graphischen 
		    Oberfläche gibt oder etwas mit NFS nicht klappt.
                </para>
            </listitem>
        </itemizedlist>
    </para>

    <para>
	Richtig gut ist es, dass man mit einem einzigen GNU/Linux-Server eine ganze
	Menge von Arbeitsplatzrechnern bedienen kann. Wie viele das sein können,
	hängt von der Art der Anwendungen auf den Clients und der Leistungsfähigkeit des Servers ab. 
    </para>

    <para>
	Es ist nicht ungewöhnlich, 40 Arbeitsplatzrechner mit jeweils Netscape
	und StarOffice über einen Dual PIII-650 mit 1GB RAM zu betreiben.
	Wir wissen, dass das geht.
        In der Tat liegt der load-average Wert selten über 1.0!
    </para>

    <sect1>
        <title>Haftungsausschluss</title>
        <para>
	    Weder der Autor noch die Übersetzer, Distributoren oder Mitautoren
	    dieses Dokumentes sind in irgendeiner Weise verantwortlich zu machen
	    für physikalische, finanzielle, moralische oder irgendwelche anderen 
	    Schäden, die infolge der Vorschläge in diesem Text eintreten.
        </para>
    </sect1>

    <sect1 id="copyright">
        <title>Copyright und Lizenz</title>
        <para>
	    Dieses Dokument steht unter dem Copyright 2002 von James McQuillan, Martin Herweg und Wolfgang Schweer 
	    und wird unter der GNU "Free Documentation License" veröffentlicht, auf
	    die hiermit verwiesen wird.        
	</para>
    </sect1>
</preface>

<chapter>
    <title>Die Theorie</title>
    <para>
	Das Booten eines plattenlosen Netzwerkrechners umfasst mehrere Stufen.
	Wenn man den Ablauf kennt, ist es viel einfacher, möglicherweise auftretende
	Probleme zu lösen.
    </para>
    <para>
	Der im weiteren beschriebene Ablauf beruht auf folgender Konfiguration: 
        <itemizedlist>
            <listitem>
                <para>Üblicher Standard-Rechner</para>
            </listitem>
            <listitem>
                <para>
                    Linksys LNE100TX Netzwerkkarte mit Etherboot -Bootrom
                </para>
            </listitem>
            <listitem>
                <para>Intel i810 Graphik Chipset</para>
            </listitem>
            <listitem>
                <para>Server mit Redhat 7.2</para>
            </listitem>
            <listitem>
                <para>DHCP</para>
            </listitem>
            <listitem>
                <para>Netzwerk-Adressen 192.168.0.0/24</para>
            </listitem>
        </itemizedlist>
    </para>

    <para>
    Wenn der Server mit Hilfe von LTSP konfiguriert wurde, passiert
    auf dem Client folgendes:
    </para>

    <orderedlist spacing="normal">
        <listitem>
            <para>
		Nach dem Einschalten läuft der "Power On Self Test" (POST) ab.
            </para>
            <para></para>
        </listitem>

        <listitem>
            <para>
		Während des Selbsttests sucht das Bios nach zusätzlichem 
		ROM. Das Etherboot Bootrom auf der Netzwerkkarte wird vom Bios 
		als solch ein zusätzlich vorhandenes ROM erkannt. 
            </para>
            <para></para>
        </listitem>

        <listitem>
            <para>
		Sobald der Selbsttest beendet ist, geht die Abarbeitung an den
		Etherboot Code über.
            </para>
            <para></para>
        </listitem>

        <listitem>
            <para>
		Der Etherboot Code sucht nach einer Netzwerkkarte. Sobald diese
		entdeckt wird, erfolgt deren Initialisierung.
            </para>
            <para></para>
        </listitem>

        <listitem>
            <para>
		Der Etherboot Code schickt dann per Broadcast eine DHCP-Anfrage
		ins lokale Netz. Dabei wird die MAC-Adresse der Netzwerkkarte
		mitverschickt.
            </para>
            <para></para>
        </listitem>

        <listitem>
            <para>
		Der auf dem Server laufende dhcpd-Prozess nimmt die Anfrage
		des Clients entgegen und sieht in seiner Konfigurationsdatei
		nach, ob dort für diese MAC-Adresse ein Eintrag vorhanden ist.
            </para>
            <para></para>
        </listitem>

        <listitem>
            <para>
		Der DHCP-Server schickt bei vorhandenem Eintrag ein Antwort-Paket,
		das mehrere Informationen für den Client enthält:
                <itemizedlist>
                    <listitem>
                        <para>
                            Die IP-Adresse des Clients
                        </para>
                    </listitem>
                    <listitem>
                        <para>
                            Die NETMASK für das lokale Netz.
                        </para>
                    </listitem>
                    <listitem>
                        <para>
			    Den Namen des Kernels, der auf dem Client gestartet 
			    werden soll (inclusive Pfadnamen) 
                        </para>
                    </listitem>
                    <listitem>
                        <para>
			    Den Pfadnamen des zu mountenden Root-Dateisystems
                        </para>
                    </listitem>
                    <listitem>
                        <para>
			    Optionale Kommandozeilen-Parameter für den Kernel 
                        </para>
                    </listitem>
                </itemizedlist>
            </para>
            <para></para>
        </listitem>

        <listitem>
            <para>
		Der Etherboot Code konfiguriert dann das TCP/IP-Interface
		der Netzwerkarte entsprechend.
            </para>
            <para></para>
        </listitem>

        <listitem>
            <para>
		Danach fordert der Etherboot Code beim Server den Download des 
		Kernels an. Dazu wird das Protokoll TFTP (Trivial File Transfer Protocol)
		verwendet.  
            </para>
            <para></para>
        </listitem>

        <listitem>
            <para>
		Nach dem vollständigen Download des Kernels legt der 
		Etherboot Code diesen an der richtigen Stelle im Hauptspeicher ab.
            </para>
            <para></para>
        </listitem>

        <listitem>
            <para>
		Die Kontrolle geht dann an den Kernel über. Dieser initialisiert
		das gesamte System inclusive aller erkannter Hardware.  
            </para>
            <para></para>
        </listitem>

        <listitem>
            <para>
		Jetzt wird es richtig spannend. An den Kernel angehängt ist
		nämlich ein Image eines Dateisystems. Dieses wird als Ramdisk
		in den Hauptspeicher geladen und vorübergehend als Root-Dateisystem
		gemountet. Dazu wird dem Kernel der Kommandozeilen-Parameter
                <command>root=/dev/ram0</command> mitgegeben.
            </para>
            <para></para>
        </listitem>
                 
        <listitem>
            <para>
		Normalerweise führt der Kernel nach Beenden des Bootens
		den <command>init</command> Prozess aus.
		Hier wird das anders gemacht: Mit dem Kommandozeilen-Parameter
                <command>init=/linuxrc</command> weisen wir den Kernel an, ein
		shell-Script auszuführen.
            </para>
            <para></para>
        </listitem>
                
        <listitem>
            <para>
                Das <command>/linuxrc</command> Script scannt zunächst den
                PCI-Bus nach einer Netzwerkkarte. 
		Für jedes gefundene PCI-Device erfolgt ein Vergleich mit der Datei
		bekannter Netzwerkkarten (/etc/niclist). Falls dort ein Eintrag 
		gefunden wird, wird das entsprechende Kernel-Modul geladen.
		Für ISA-Karten muss der Name des Moduls dem Kernel als
		Kommandozeilen-Parameter übergeben werden. Zusätzlich sind noch 
		eventuell erforderliche Werte für IO-Adresse und IRQ zu übergeben.
            </para>
            <para></para>
        </listitem>

        <listitem>
            <para>
		Wenn die Werte stimmen, wird die Karte vom Kernel-Modul 
		identifiziert und das Modul geladen.
            </para>
            <para></para>
        </listitem>

        <listitem>
            <para>
		Danach wird der Prozess
                <command>dhclient</command> gestartet, um erneut eine Anfrage
		an den DHCP-Server zu stellen. Diese zweite Anforderung von 
		Daten, diesmal im user-space, ist aus zwei Gründen notwendig:
		Einmal wird die durch den Etherboot Code erhaltene Antwort vom
		Kernel 'verschluckt' und zweitens ignoriert der Kernel die Angabe
		eines möglicherweise in der root-path Option spezifizierten 
		NFS-Servers. Dies ist von Bedeutung, falls der NFS-Server und
		der TFTP-Server unterschiedlich sein sollen.
            </para>
            <para></para>
        </listitem>

        <listitem>
            <para>
                Wenn der <command>dhclient</command> eine Antwort vom Server bekommt,
                führt er das <command>/etc/dhclient-script</command> aus und konfiguriert
		das Netzwerk-Interface eth0 entsprechend.
            </para>
            <para></para>
        </listitem>


        <listitem>
            <para>
		Bis zu diesem Zeitpunkt liegt das root-Dateisystem auf einer Ram-Disk.
		Nun mountet das /linuxrc-Script ein neues root-Dateisystem per NFS.
                Typischerweise wird dies <command>/opt/ltsp/i386</command> auf dem
		NFS-Server sein.
                Das neue root-Dateisystem kann nicht sofort von /linuxrc als / 
		gemountet werden sondern zun]chst als /mnt.
		Danach wird vom Script das Kommando <command>pivot_root</command>
		ausgeführt.
		pivot_root mountet das alte System auf /oldroot und macht damit 
		Platz für das neue, per NFS gemountete System, was dann unter / zur 
		Verfügung steht.
            </para>
            <para></para>
        </listitem>

        <listitem>
            <para>
		Nach Mounten und Verschieben (pivoting) des neuen 
		root-Dateisystems ist das /linuxrc-Script abgearbeitet und
		das eigentliche <command>init</command> Programm kann gestartet werden.
            </para>
            <para></para>
        </listitem>

        <listitem>
            <para>
		Der init-Prozess liest die Datei <filename>/etc/inittab</filename>
		und setzt die Systemumgebung entsprechend.
            </para>
            <para></para>
        </listitem>

        <listitem>
            <para>
                Init ermöglicht sogenannte <emphasis>runlevel</emphasis>. 
		Jedes runlevel definiert eine Menge von Diensten für den Client.
                Der LTSP-Client startet im runlevel '2'.
		Dies wird durch die <emphasis>initdefault</emphasis> Zeile in
                der Datei inittab festgelegt.
            </para>
            <para></para>
        </listitem>

        <listitem>
            <para>
        	Einer der ersten Eintr]ge in der inittab-Datei ist das Script
                <command>rc.local</command>, das während der 
                '<emphasis role="strong">sysinit</emphasis>' Phase des Clients abläuft.
            </para>
            <para></para>
        </listitem>

        <listitem>
            <para>
		Das rc.local Script legt eine Ram-Disk von 1 Mb an. Diese wird alles
		enthalten, was geschrieben oder in irgendeiner Weise verändert werden muss.
            </para>
            <para></para>
        </listitem>

        <listitem>
            <para>
		Die Ram-Disk wird als Verzeichnis <filename class="directory">/tmp</filename>
                gemountet.
		Alle Dateien, die Schreibrecht gesetzt haben müssen, sind tatsächlich nur
		hier im Verzeichnis anzusiedeln. Symbolisch Links verweisen von der notwendigen Position aus dann hierhin.
            </para>
            <para></para>
        </listitem>

        <listitem>
            <para>
                Dann wird das <filename class="directory">/proc</filename> Dateisystem
                gemountet.
            </para>
            <para></para>
        </listitem>

        <listitem>
            <para>
		Falls für den Client Swapping über NFS eingestellt wurde,
		dann wird nun das Verzeichnis <command>/var/opt/ltsp/swapfiles</command>
                als /tmp/swapfiles gemonutet.
		Falls noch kein Swapfile für diesen Client vorhanden ist, wird nun
		einer angelegt; die Größe des Swapfiles wird in 
                in der Konfigurationsdatei <filename>lts.conf</filename> festgelegt.
            </para>
            <para>
                Durch das <command>swapon</command> Kommando wird der Swapfile aktiviert.
            </para>
            <para></para>
        </listitem>

        <listitem>
            <para>
                Das Netzwerk-Device <emphasis role="strong">loopback</emphasis> 
                wird konfiguriert.  Dies hat <emphasis>127.0.0.1</emphasis> als IP-Adresse.
            </para>
            <para></para>
        </listitem>

        <listitem>
            <para>
		Wenn der Client per Konfigurationsdatei so eingerichtet wurde,
		dass Programme auf dem Client selbst ausgeführt werden (local apps),
		dann wird nun <command>/home</command> vom Server auf /home lokal
                gemountet, so dass die Programme Zugriff auf das Home-Verzeichnis des
		Benutzers haben.
            </para>
            <para></para>
        </listitem>

        <listitem>


            <para>
    		Etliche Verzeichnisse werden nun im <filename class="directory">/tmp</filename>
		Verzeichnis angelegt, damit dort Dateien abgelegt werden können, die
		während der Laufzeit des Client-Rechners notwendig sind.
		Es handelt sich um folgende Verzeichnisse:
                <orderedlist>
                    <listitem>
                        <para>
                            <filename>/tmp/compiled</filename>
                        </para>
                        <para></para>
                    </listitem>
                    <listitem>
                        <para>
                            <filename>/tmp/var</filename>
                        </para>
                        <para></para>
                    </listitem>
                    <listitem>
                        <para>
                            <filename>/tmp/var/run</filename>
                        </para>
                        <para></para>
                    </listitem>
                    <listitem>
                        <para>
                            <filename>/tmp/var/log</filename>
                        </para>
                        <para></para>
                    </listitem>
                    <listitem>
                        <para>
                            <filename>/tmp/var/lock</filename>
                        </para>
                        <para></para>
                    </listitem>
                    <listitem>
                        <para>
                            <filename>/tmp/var/lock/subsys</filename>
                        </para>
                        <para></para>
                    </listitem>
                </orderedlist>
            </para>
            <para></para>

            <para>
                Alle sind damit verfügbar.
            </para>
            <para></para>
        </listitem>

        <listitem>
            <para>
		Nun wird das X Window System konfiguriert. In der Konfigurationsdatei
                <command>lts.conf</command> gibt es den Parameter
                <command>XSERVER</command>.  Fehlt dieser Parameter
                oder ist er auf "<command>auto</command>" gesetzt, dann
                wird versucht, den passenden Graphiktreiber automatisch zu bestimmen.
		Für eine PCI-Karte lassen sich nämlich die Angaben "PCI Vendor" und "Device id" 
		feststellen. Diese werden mit den Einträgen in der Datei 
		<command>/etc/vidlist</command> verglichen.
            </para>
            <para>
        	Wenn die Karte von XFree86 4.x unterstützt wird und in der Liste 
		ein Eintrag vorhanden ist, dann wird der Name des Treiber-Moduls 
		an das Script zurückgegeben. Falls in der Konfigurationsdatei
		lts.conf für eine nur von XFree86 3.3.6 unterstützte Karte der
		entsprechende X-Server (Namen, die  mit 'XF86_' beginnen) angegeben 
		wurde, dann wird dieser Wert zurückgegeben. Damit ist klar, welcher
		X-Server zu starten ist.       
            </para>
            <para></para>
        </listitem>

        <listitem>
            <para>
		Falls Version 4.x verwendbar ist, dann wird nun mittels des
		Skripts <command>/etc/rc.setupx</command> die Konfigurationsdatei
		XF86Config erzeugt.  Für  XFree86 3.3.6 übernimmt diese Aufgabe
                das Script <command>/etc/rc.setupx3</command>.
            </para>
            <para>
		Zum Erzeugen dieser Konfigurationsdatei XF86Config werden die 
		Einträge in der Datei <command>/etc/lts.conf</command> benutzt.
            </para>
            <para></para>
        </listitem>

        <listitem>
            <para>
		Nachdem XF86Config angelegt wurde, geht die Kontrolle zurück
		an das rc.local Script.
		Das Script <command>/tmp/start_ws</command> wird erzeugt.
                Mit Hilfe dieses Skripts kann der passende X-Server gestartet
		werden.
            </para>
            <para></para>
        </listitem>

        <listitem>
            <para>
		Die Datei <filename>/tmp/syslog.conf</filename>
		wird angelegt. Diese enthält Informationen für den
                <command>syslogd</command> Prozess, an welchen Rechner im Netzwerk
		Systemmeldungen geschickt werden sollen. Dieser Rechnername ist in
		der Datei <filename>lts.conf</filename> anzugeben.
		Der symbolische Link <filename>/etc/syslog.conf</filename> 
		zeigt auf die in der Ram/Disk liegende Datei 
		<filename>/tmp/syslog.conf</filename>.
            </para>
            <para></para>
        </listitem>

        <listitem>
            <para>
                Nun kann der Hintergrundprozess (daemon) <command>syslogd</command> gestartet werden.
            </para>
            <para></para>
        </listitem>

        <listitem>
            <para>
		Die Steuerung geht wieder an den <command>init</command> zurück.
                Dieser entscheidet anhand des <emphasis role="strong">initdefault</emphasis>
		Eintrages, welches <emphasis role="strong">runlevel</emphasis>
		benutzt werden soll; seit lts_core-2.08, lautet der Wert <emphasis role="strong">2</emphasis>.
            </para>
            <para></para>
        </listitem>

        <listitem>
            <para>
		In runlevel <emphasis role="strong">2</emphasis> führt der 
                init-Prozess das Script
                <command>set_runlevel</command> aus; dieses liest die Konfigurationsdatei
                lts.conf ein und legt aufgrund des Eintrages f@r den Client fest, welches aktuelle
		runlevel zu benutzen ist.
            </para>
            <para>
                Die vorhandenen runlevel sind
                <emphasis role="strong">3</emphasis>,
                <emphasis role="strong">4</emphasis> und
                <emphasis role="strong">5</emphasis>.
                <itemizedlist>
                    <listitem>
                        <para>
                            <emphasis role="strong">3</emphasis> - Startet
			    eine shell (bash). Nützlich zum Debuggen: Wenn der
			    Client nicht so will, wie er soll.
                        </para>
                        <para></para>
                    </listitem>
                    <listitem>
                        <para>
                            <emphasis role="strong">4</emphasis> - Startet
                            eine oder mehrere telnet-Sitzungen (textbasiert).
                            Geeignet, wenn alte serielle Terminals auf einfache Weise 
			    ersetzt werden sollen.
                        </para>
                        <para></para>
                    </listitem>
                    <listitem>
                        <para>
                            <emphasis role="strong">5</emphasis> - Graphischer Modus.
                            X wird gestartet, eine XDMCP-Anfrage geht an den Server,
			    der dann seinerseits ein Anmelde-Fenster schickt. Dazu muss
			    auf dem Server ein Display-Manager laufen, wie z.B. 
                            <emphasis role="strong">XDM</emphasis>,
                            <emphasis role="strong">GDM</emphasis> oder
                            <emphasis role="strong">KDM</emphasis>.
                        </para>
                        <para></para>
                    </listitem>
                </itemizedlist>
            </para>
            <para></para>
        </listitem>
    </orderedlist>
    <para></para>
</chapter>

<chapter>
    <title>LTSP auf dem Server installieren</title>
    <para>
        Die LTSP-Pakete gibt es im
        <emphasis role="strong">RPM</emphasis> und
        <emphasis role="strong">TGZ</emphasis> Format.  
	Je nach Wahl folge man den Beschreibungen in den entsprechenden Abschnitten
    </para>

    <para>
        Wenn auf den Clients das X Window System laufen soll, müssen vier
        Pakete installiert werden. Man beachte, dass in diesem Beispiel von einem Client-Rechner
	mit einer Tulip-Chip basierten Netzwerkkarte sowie einer Graphikkarte mit Intel i810 
	Chipsatz ausgegangen wird.
            
        <orderedlist>
            <listitem>
                <para>
                    Das Paket LTSP Core 
                </para>
            </listitem>
            <listitem>
                <para>
                    Das Paket Kernel 
                </para>
            </listitem>
            <listitem>
                <para>
                    Das Paket X Core 
                </para>
            </listitem>
            <listitem>
                <para>
                    Das Paket X Fonts
                </para>
            </listitem>
        </orderedlist>
	Das letzte Paket wird eigentlich nicht benötigt, für eine Erstinstallation
	jedoch empfolen. Nachdem Server und Clients laufen, kann man einen 
        X Font Server (XFS) einrichten, der dann den Job übernimmt.
     </para>

     <para>
	Nach Installation der Pakete muss das LTSP System 
        initialisiert werden.
	Dabei werden unter anderem Änderungen an an Konfiguratoinsdateien auf
	dem Server vorgenommen. Dies ist notwendig, damit der Server den Clients
	die erforderlichen Dienste zur Verfügung stellen kann.
    </para>

    <sect1>
        <title>RPM-Pakete installieren</title>
        <para>
	    Laden Sie die neuesten ltsp-Pakete herunter und installieren Sie diese
	    mit den folgenden Kommandos auf Ihrem Server:
            <programlisting>
		rpm -ivh ltsp_core-3.0.0-1.i386.rpm

		rpm -ivh ltsp_kernel-3.0.1-1.i386.rpm

		rpm -ivh ltsp_x_core-3.0.1-1.i386.rpm

		rpm -ivh ltsp_x_fonts-3.0.0-0.i386.rpm
	    </programlisting>
            Die Installation erfolgt damit im Verzeichnis
            <filename class="directory">/opt/ltsp/i386</filename>.
        </para>
    </sect1>

    <sect1>
        <title>TGZ-Pakete installieren</title>

        <para>
	    Laden Sie die neuesten ltsp-Pakete herunter und installieren Sie diese
	    mit den folgenden Kommandos auf Ihrem Server:
            <programlisting>
		tar xzf ltsp_core-3.0.0-i386.tgz
		cd ltsp_core
		./install.sh
		cd ..

		tar xzf ltsp_kernel-3.0.1-i386.tgz
		cd ltsp_kernel
		./install.sh
		cd ..

		tar xzf ltsp_x_core-3.0.1-i386.tgz
		cd ltsp_x_core
		./install.sh
		cd ..

		tar xzf ltsp_x_fonts-3.0.0-i386.tgz
		cd ltsp_x_fonts
		./install.sh
		cd ..
	    </programlisting>
            Die Installation erfolgt damit im Verzeichnis
            <filename class="directory">/opt/ltsp/i386</filename>. Achten Sie
	    darauf, alle vier Pakete in einem Durchgang zu installieren.
        </para>
    </sect1>

    <sect1>
        <title>Initialisieren des Servers</title>
        <para>
	    Nachdem die obigen Pakete installiert sind, wechseln Sie bitte in das
	    Verzeichnis <filename class="directory">/opt/ltsp/templates</filename>.
            Dort finden Sie Dateien, die die Konfiguration Ihres Servers verändern werden.
	    Für jede auf dem Server zu modifizierende Datei liegt hier ein Muster vor.
	    Sehen Sie sich den Inhalt der Dateien an und vergewissern Sie sich, dass Sie
	    die entsprechenden Änderungen vornehmen wollen. Die Änderungen könnten 
	    die Sicherheit Ihres Systems gefährden. Die Änderungen können Sie per Hand
	    vornehmen - oder automatisch: Starten Sie dazu das 
            Script ltsp_initialize:
            <programlisting>
		cd /opt/ltsp/templates
		./ltsp_initialize 
	    </programlisting>

            Sie erhalten jeweils eine Abfrage, ob ein Dienst konfiguriert werden soll.  

            Es geht dabei um folgende Dienste:

            <itemizedlist>
                <listitem>
                    <para>XDM - der X Display Manager</para>
                </listitem>
                <listitem>
                    <para>GDM - der Gnome Display-Manager</para>
                </listitem>
                <listitem>
                    <para> Startscript des Display Managers </para>
                </listitem>
                <listitem>
                    <para>bootp</para>
                </listitem>
                <listitem>
                    <para>Die Datei /etc/exports </para>
                </listitem>
                <listitem>
                    <para>tcpwrapper</para>
                </listitem>
                <listitem>
                    <para>portmapper</para>
                </listitem>
                <listitem>
                    <para>syslogd</para>
                </listitem>
                <listitem>
                    <para>TFTP Start-Script</para>
                </listitem>
            </itemizedlist>
        </para>
    </sect1>

    <sect1>
        <title>Konfiguration der Clients</title>
        <para>
	    Auf dem Server sind die Informationen zu den einzelnen Clients
	    in drei Dateien enthalten:

            <orderedlist>

                <listitem>
                    <para>/etc/dhcpd.conf</para>
                </listitem>

                <listitem>
                    <para>/etc/hosts</para>
                </listitem>

                <listitem>
                    <para>/opt/ltsp/i386/etc/lts.conf</para>
                </listitem>

            </orderedlist>

        </para>

        <sect2>
            <title>/etc/dhcpd.conf</title>
            <para>
                Der Client braucht eine IP-Adresse und weitere Informationen.
                Er bekommt folgendes vom DHCP-Server:
                <itemizedlist>
                    <listitem> <para>IP-Adresse</para> </listitem>
                    <listitem> <para>hostname</para> </listitem>
                    <listitem> <para>Server IP</para> </listitem>
                    <listitem> <para>Default gateway</para> </listitem>
                    <listitem> <para>Name des zu ladenden Kernels incl. Pfadangabe</para> </listitem>
                    <listitem> <para>Servername und Verzeichnis auf dem Server, das als root Dateisystem
			             gemountet werden soll</para></listitem>
                </itemizedlist>
            </para>
            <para>
		In unserem Beispiel weisen wir per DHCP-Server den Clients
                feste IP-Adressen zu.
            </para>
            <para>
                Das ltsp_initialize-Script legt ein Muster namens
                <filename>/etc/dhcpd.conf.example</filename> an.
                Sie können dieses nach /etc kopieren als
                <filename>/etc/dhcpd.conf</filename> und diese Datei dann als
		Basis benutzen. Selbstverständlich müssen Sie Anpassungen an
		Ihre eigene Systemumgebung vornehmen und die Angaben zu den
		Clients anpassen, insbesondere die MAC-Adresse unter 'hardware'
		eines jeden Clients.
                <figure float="1">
                <title>/etc/dhcpd.conf</title>
                <programlisting>
		    default-lease-time            21600;
		    max-lease-time                21600;
    
		    option subnet-mask            255.255.255.0;
		    option broadcast-address      192.168.0.255;
		    option routers                192.168.0.254;
		    option domain-name-servers    192.168.0.254;
		    option domain-name            "ltsp.org";
		    option root-path              "192.168.0.254:/opt/ltsp/i386";
    
		    shared-network WORKSTATIONS {
		    subnet 192.168.0.0 netmask 255.255.255.0 {
		        }
		    }
    
		    group	{
		        use-host-decl-names       on;
		        option log-servers        192.168.0.254;
    
		        host ws001 {
		            hardware ethernet     00:E0:18:E0:04:82;
		            fixed-address         192.168.0.1;
		            filename              "/lts/vmlinuz.ltsp";
		        }
		    } </programlisting>
                </figure>
            </para>

            <para>
		Seit der Version 2.09pre2 von LTSP ist es nicht mehr
		notwendig, einen speziellen Kernel anzugeben.
		Die Kernel des Standard-Paketes enthalten Treibermodule
		für alle von Linux unterstützten Netzwerkkarten.
		Es gibt zwei Kernel; einer enthält den 
                Linux Progress Patch (LPP), der andere nicht.
		Sie sind an ihren Namen zu erkennen:
                <programlisting>
		    vmlinuz-2.4.9-ltsp-5
		    vmlinuz-2.4.9-ltsp-lpp-5 
		</programlisting>
            </para>
            <para>
		Vielleicht ist Ihnen aufgefallen, das der Kernel im Verzeichnis
                <filename class="directory">/tftpboot/lts</filename>
                liegt, der Eintrag "filename" in der Datei 
                <filename>/etc/dhcpd.conf</filename> aber nicht den Vorsatz
                <filename class="directory">/tftpboot</filename>
                enthält.  Das hat folgenden Grund: Seit der Red-Hat  
                Versions 7.1 läuft
                TFTP mit der Option '-s', d.h der Prozess tftpd
                läuft im <emphasis role="strong">secure</emphasis>
                Modus: Beim Start wird ein <command>chroot</command> zum Verzeichnis
                <filename class="directory">/tftpboot</filename> ausgeführt.
		Damit sind für den tftpd-Prozess alle Dateien relativ zum Verzeichnis
                <filename class="directory">/tftpboot</filename> erreichbar.
            </para>
            <para>
		Falls bei Ihrer Distribution die Option '-s' nicht verwendet wird,
                muss die Angabe <filename class="directory">/tftpboot</filename>
		vor den Pfadnamen des Kernels gesetzt werden.
            </para>
        </sect2>

        <sect2>
            <title>/etc/hosts</title>
            <para>IP-Adressen und Rechnernamen</para>
            <para>
		Computer kommen i.a. mit IP-Adressen aus. Menschen haben lieber Namen
		für ihre Rechner. Für die Zuordnung gibt es Nameserver 
		(DNS) oder die Datei <filename>/etc/hosts</filename>.
		In einer LTSP-Umgebung ist dies unverzichtbar, da es sonst
		keinen Zugriff der Clients auf das vorgesehene root-Verzeichnis
		auf dem Server per NFS gibt.
            </para>
            <para>
		Ausserdem könnte es bei fehlendem Eintrag des Clients in der
		Datei <filename>/etc/hosts</filename> zu Problemen mit
                <emphasis role="strong">GDM</emphasis> oder
                <emphasis role="strong">KDM</emphasis> kommen.
            </para>
        </sect2>

        <sect2>
            <title>/opt/ltsp/i386/etc/lts.conf</title>
            <para>
		In dieser Datei gibt es eine ganze Reihe von
		Konfigurationseinträgen.
            </para>

            <para>
                Die Datei <filename>lts.conf</filename> hat eine einfache Syntax
		und besteht aus mehreren Sektionen.  Es gibt eine Sektion, die für 
		alle Clients gilt: <command>[default]</command> und
                es kann für einzelne Clients spezifische Einträge geben
		Der Client kann durch Rechnernamen, IP-Adresse oder MAC-Adresse
		angegeben werden. 
            </para>

            <para>
                Eine <filename>lts.conf</filename> Datei sieht üblicherweise 
		so aus:
                <example>
                    <title>lts.conf file</title>
                    <programlisting>
#
# Config file for the Linux Terminal Server Project (www.ltsp.org)
#

[Default]
        SERVER             = 192.168.0.254
        XSERVER            = auto
        X_MOUSE_PROTOCOL   = "PS/2"
        X_MOUSE_DEVICE     = "/dev/psaux"
        X_MOUSE_RESOLUTION = 400
        X_MOUSE_BUTTONS    = 3

# Diese Werte sollten gesetzt werden, um den deutschen Zeichensatz 
# unter X Window benutzen zu können; voreingestellt ist der englische.

	XkbModel	   = pc104
	XkbLayout	   = de

# Ende der besonderen Einstellungen

        USE_XFS            = N
        LOCAL_APPS         = N
        RUNLEVEL           = 5

[ws001]
        USE_NFS_SWAP       = Y
        SWAPFILE_SIZE      = 48m
        RUNLEVEL           = 5

[ws002]
        XSERVER            = XF86_SVGA
        LOCAL_APPS         = N
        USE_NFS_SWAP       = Y
        SWAPFILE_SIZE      = 64m
        RUNLEVEL           = 3
	</programlisting>
                </example>
            </para>

            <para>
                Es folgt eine Liste einiger Konfigurationsvariablen:
                <variablelist>
                    <varlistentry>
                        <term><command>XSERVER</command></term>
                        <listitem>
                            <para>
				Wenn der Client eine von XFree86 4.1 unterstützte
				PCI-Graphikkarte hat, dann reicht es aus,
				das Paket ltsp_x_core installiert zu haben.
				Alles läuft automatisch ab, ein Eintrag ist nicht erforderlich.    
                            </para>
                            <para>
                                Falls der Client eine ISA-Karte hat oder die 
				(PCI)-Karte nicht unterstützt wird, muss hier der 
				richtige X-Server von XFree86 3.3.6 angegeben werden.
				Es stehen dafür mehrere LTSP-Pakete zur Verfügung.
                            </para>
                            <para>
                                Einträge können in der Datei
                                <filename>lts.conf</filename> pro Client
                                oder zentral in der default-Sektion erfolgen.
                            </para>
                            <para>
                                Da unser Beispiel-Client ein Intel i810 video
                                Chipset hat, was automatisch erkannt wird,
                                braucht kein XSERVER-Eintrag gemacht zu werden.
				Wenn man will, kann man 'auto' eintragen oder 
				das Treibermodul.
                            </para>
                        </listitem>
                    </varlistentry>

                    <varlistentry>
                        <term><command>RUNLEVEL</command></term>
                        <listitem>
                            <para>
                                Da der Client im Graphik-Modus laufen soll,
                                wird runlevel auf '5' gesetzt.
                            </para>
                        </listitem>
                    </varlistentry>
                </variablelist>
            </para>
        </sect2>
    </sect1>
</chapter>



<chapter>
    <title>Die Konfiguration des Client-Rechners</title>
    <para>
        Nach dem Einrichten des Servers kommt nun der Client an die Reihe.
    </para>
    <para>
        LTSP beginnt dann, wenn der Kernel im Arbeitsspeicher des Client ist.
	Es gibt mehrere Wege, den Kernel zu laden:
	Etherboot, Netboot, PXE und Diskette.
    </para>

    <para>
	Hier gehen wir davon aus, den Rechner von Diskette zu booten.
        
	Die Diskette wird Code des <command>Etherboot</command> Projekts enthalten.
    </para>

    <sect1>
        <title>Bootdiskette herstellen</title>
        <blockquote><attribution>Ken Yap</attribution>
        <para>
	    Etherboot ist ein Softwarepaket zum Erstellen von ROM-Images.
	    Dieses Image enthält Code, der in einem Ethernet-Netzwerk einen 
	    Download von Software durchführen kann. Viele Netzwerkkarten haben
	    einen Sockel für ein Bootrom, auf das dieser Code übertragen 
	    werden  kann.
        </para>
        </blockquote>

        <para></para>

        <para>
            Auch Etherboot ist Open Source und steht unter der  GNU General
            Public License, Version 2 (GPL2).
        </para>

        <para>
	    Sie können das Etherboot-Paket downloaden und ein passendes 
	    Image herstellen, das dann in ein EPROM gebrannt
	    oder erst einmal zu Testzwecken auf eine Diskette kopiert werden kann.
        </para>

        <para>
            Eine einfachere Alternative sind Marty Connor's Webseiten unter 
            <ulink url="http://www.rom-o-matic.net"><citetitle>www.Rom-O-Matic.net</citetitle></ulink>.
        </para>

        <para>
	    Marty hat ein exzellentes web-basiertes frontend geschaffen,
	    um ein angepasstes Bootrom mit Etherboot zu generieren.
	    Man wählt einfach seine Netzwerkkarte aus und gibt an, welche Art von
	    Image es sein soll. Es gibt viele weitere Konfigurationsmöglichkeiten.
	    Nachdem alles eingegeben ist, reicht ein Klick auf den Button 'Get ROM',
	    um das Image generieren zu lassen.
        </para>

        <para>
    	    Unser Beispielrechner hat eine Netzwerkkarte vom Typ Linksys LNE100TX, version 4.1.
            Die Karte hat einen ADMTek Centaur-P Chipsatz; deshalb ist
            <emphasis role="strong">centaur-p</emphasis> als NIC/ROM-Typ zu wählen.
        </para>

        <para>
	    Änderungen der Voreinstellungen sind nicht notwendig, daher
	    überspringen wir den 'Configure' Button.
        </para>

        <para>
            Als 'ROM output format' wählen wir 'Floppy Bootable ROM Image'.
            Dadurch bekommt das Image einen 512 Byte großen Header als 
	    boot-loader für das eigentliche Etherboot Image verpasst.
	    Der boot-loader lädt bei Start des Rechners per Diskette 
	    das Image in den Arbeitsspeicher, wo es dann
	    ausgeführt wird. 
        </para>

        <para>
    	    Jetzt ist der 'Get ROM' Button an der Reihe.
	    Es dauert nur einige Sekunden, bis das Image generiert worden ist
	    und auf dem eigenen Rechner gespeichert werden kann. In diesem Beispielfall
	    hat das Image den Namen 'eb-5.0.2-centaur-p.lzdsk'.
	    
        </para>

        <para>
    	    Das Image wird nun auf eine 3,5"-Diskette kopiert (kann natürlich auch
	    eine 5,25"-Diskette sein, dann entsprechend anpassen)    
            <programlisting>
cat   /pfad_zum_image/eb-5.0.2-centaur-p.lzdsk   >/dev/fd0 </programlisting>
        </para>

    </sect1>

</chapter>

<chapter>
    <title>Starten des Client-Rechners</title>
    <para>
	Eigentlich sollte nun Starten per Diskette reichen - wenn alles richtig
	konfiguriert wurde:
    </para>

    <para>
	Der Etherboot-Code wird von der Diskette in den Arbeitsspeicher geladen, 
	die Netzwerkkarte wird erkannt und initialisiert, eine DHCP-Anfrage wird ins
	Netzwerk geschickt, der DHCP-Server antwortet, der Kernel wird vom Server 
	heruntergeladen und gestartet. Der Kernel erkennt die Hardware, X startet
	und ein graphisches Login erscheint auf dem Monitor, ähnlich wie im 
	unten gezeigten Beispiel.
    </para>

    <figure><title>Login-Bildschirm</title>
        <GRAPHIC FILEREF="ltsplogin1.gif"
                 FORMAT="GIF"
                 SRCCREDIT="James McQuillan, 2001" >
    </figure>

    <para>
	Normales Einloggen sollte nun möglich sein.
	Wichtig ist: Man meldet sich auf dem Server an und arbeitet dort.
	Alle Kommandos werden auf dem Server aufgeführt, der Output auf
	dem Client-Monitor dargestellt. Das ist die Netzwerk-Fähigkeit des 
	X Window Systems.
    </para>

    <para>
        Alle Programme auf dem Server stehen zur Verfügung.
    </para>

</chapter>

<chapter>
    <title>Drucken</title>
    <para>
	Der Client kann neben seiner Rolle als voll funktionsfähiges
	Terminal auch noch als Printserver benutzt werden. Bis zu drei
	Drucker können an die parallelen und seriellen Ports angeschlossen
	werden.
    </para>

    <para>
	Dies ist für den Benutzer des Client-Rechners transparent; die
	zusätzliche Netzwerklast wird kaum bemerkbar sein.
    </para>

    <sect1>
        <title>Einrichten des Client-Rechners</title>

        <para>
            LTSP benutzt das  <command>lp_server</command> Programm auf dem
	    Client, um die Druckaufträge des Servers auf die Ports des Client
	    umzuleiten.
        </para>

        <para>
	    Es gibt einige Einträge in der Konfigurationsdatei <command>lts.conf</command>
	    um das Drucken zu steuern:
            <programlisting>
		[ws001]
		    PRINTER_0_DEVICE = /dev/lp0
		    PRINTER_0_TYPE   = P 
	    </programlisting>
            Dieser Eintrag lässt das lp_server Programm als Dämon laufen, der
            auf dem TCP/IP-Port 9100 auf Druckaufträge wartet.
	    Der Drucker am ersten parallelen Anschluss des Client-Rechners bekommt die
	    Daten durchgereicht.
        </para>

        <para>
	    Es gibt viele weitere Einstellmöglichkeiten fürs Drucken.
	    Man findet diese weiter unten in diesem Dokument in der Beschreibung von lts.conf. 
        </para>
    </sect1>

    <sect1>
        <title>Einrichten des Servers</title>

        <para>
	    Das Einrichten auf dem Server beinhaltet die Definition einer
	    Druckerwarteschlange mit einem entsprechenden Konfigurationstool.
        </para>

        <para>
            Redhat 7.2, hat dafür sowohl GUI- wie textbasierte Tools.
	    Das GUI Tool heißt <command>printconf-gui</command>, und 
	    das textbasierte <command>printconf-tui</command>.  
	    ältere Versionen von Redhat haben ein Programm namens 
	    <command>printtool</command>.
            Printtool gibt es auch in Redhat 7.2, aber in diesem Beispiel
	    benutzen wir printconf-gui.  
	    Andere Linux-Distributionen haben ihre eigenen Konfigurationstools,
	    neuere Versionen von SuSE beispielsweise erlauben die Konfiguration 
	    mit YAST, YAST2 oder lprsetup.
        </para>

        <figure>
            <title>Drucker definieren mit printconf-gui</title>
            <GRAPHIC FILEREF="printconf-gui-add.gif"
                     FORMAT="GIF"
                     SRCCREDIT="James McQuillan, 2001" >
        </figure>

        <para>
    	    Nach Aufruf des Tools definieren wir einen neuen Drucker.     
            Das lp_server Programm kann auf dem Client einen HP JetDirect Printserver
	    emulieren.
	    Auf dem Server muss daher ein <command>JetDirect</command> Drucker eingerichtet werden.
        </para>

        <para>
	    Der neu einzurichtende Drucker braucht einen Namen für die Warteschlange.
	    Dieser Name kann zwar beliebig gewählt werden, sollte aber sinnvoll sein
	    und aus folgenden Zeichen zusammengesetzt:
            <itemizedlist>
                <listitem>
                    <para>
                        <computeroutput>
                            "a-z"  Kleinbuchstaben
                        </computeroutput>
                    </para></listitem>
                <listitem>
                    <para>
                        <computeroutput>
                            "A-Z"  Großbuchstaben
                        </computeroutput>
                    </para></listitem>
                <listitem>
                    <para>
                        <computeroutput>
                            "0-9"  Ziffern
                        </computeroutput>
                    </para></listitem>
                <listitem>
                    <para>
                        <computeroutput>
                            "-"    &nbsp;&nbsp;Bindestrich
                        </computeroutput>
                    </para></listitem>
                <listitem>
                    <para>
                        <computeroutput>
                            "_"    &nbsp;&nbsp;Unterstrich
                        </computeroutput>
                    </para></listitem>
            </itemizedlist>
        </para>
        <para>
    	    Im Beispiel nehmen wir den Namen
            <command>ws001_lp</command>. Damit ist klar, dass dieser Drucker
            am Client <command>ws001</command> betrieben wird.
        </para>

        <figure>
            <title>printconf-gui Detail Info</title>
            <GRAPHIC FILEREF="printconf-gui-detail.gif"
                     FORMAT="GIF"
                     SRCCREDIT="James McQuillan, 2001" >
        </figure>
        <para>
    		Zwei Felder sind auszufüllen:	    
            <orderedlist>
                <listitem>
                    <para>
                        IP-Adresse oder Name des Rechners, an den der Drucker angeschlossen ist.
                    </para>
                </listitem>
                <listitem>
                    <para>
                        Der TCP-Port des <command>lp_server</command> Prozesses.
                    </para>
                    <para>
                        Für den ersten Drucker an einem Client ist das 
                        Port <command>9100</command>, für weitere die Ports
                        <command>9101</command> und <command>9102</command>.
                    </para>
                </listitem>
            </orderedlist>
        </para>
    </sect1>

</chapter>

<chapter>
    <title>Fehlersuche</title>
    <para>
	Für den Fall, dass der Client nicht bootet oder sonst etwas falsch
	läuft, hier einige Tipps zur Fehlersuche und -beseitigung.
    </para>

    <para>
	Stellen Sie fest, bis wohin der Bootvorgang abläuft.
    </para>

    <sect1>
        <title>Fehlersuche beim Starten von Diskette</title>
        <para>
	    Einige Möglichkeiten, wie es beim Start von Diskette
	    aussehen könnte:
        </para>
        <para>
        <screen>
loaded ROM segment 0x0800 length 0x4000 reloc 0x9400
Etherboot 5.0.1 (GPL) Tagged ELF for [LANCE/PCI]
Found AMD Lance/PCI at 0x1000, ROM address 0x0000
Probing...[LANCE/PCI] PCnet/PCI-II 79C970A base 0x1000, addr 00:50:56:81:00:01
Searching for server (DHCP)...
&#60;sleep&#62; </screen>
        </para>
        <para>
	    Wie das Beispiel zeigt, kann man den Startvorgang auf dem Monitor
	    beobachten.
	    Sieht man nichts, dann kann dies an einer fehlerhaften Diskette
	    liegen oder daran, dass das Image nicht richtig abgelegt wurde.
        </para>

        <para>
	    Bei einer Meldung wie der folgenden kann man vermuten, dass der 
	    falsche Treiber auf die Diskette geschrieben wurde.
        <screen>
ROM segment 0x0800 length 0x8000 reloc 0x9400
Etherboot 5.0.2 (GPL) Tagged ELF for [Tulip]
Probing...[Tulip]No adapter found
&#60;sleep&#62;
&#60;abort&#62; </screen>
        </para>

        <para>
	    Wenn die Netzwerkkarte erkannt wird und die MAC-Adresse
	    richtig angegeben wird, dann ist die Diskette wohl in Ordnung
	    und der Fehler liegt woanders.
        </para>
 
    </sect1>

    <sect1>
        <title>Fehlerursache DHCP</title>
        <para>
	    Sobald die Netzwerkkarte initialisiert wurde, schickt der
	    Etherboot-Code eine DHCP-Anfrage per Broadcast ins lokale Netz.
        </para>

        <para>
	    Wenn der Client-Rechner eine Antwort bekommt, dann konfiguriert der 
	    Code die Netzwerkkarte. Wenn die IP-Adresse auf dem Monitor angezeigt
	    wird, ist alles klar gegangen. Hier ein Beispiel, wie es aussehen sollte:
            <screen>
ROM segment 0x0800 length 0x4000 reloc 0x9400
Etherboot 5.0.1 (GPL) Tagged ELF for [LANCE/PCI]
Found AMD Lance/PCI at 0x1000, ROM address 0x0000
Probing...[LANCE/PCI] PCnet/PCI-II 79C970A base 0x1000, addr 00:50:56:81:00:01
Searching for server (DHCP)...
&#60;sleep&#62;
Me: 192.168.0.1, Server: 192.168.0.254, Gateway 192.168.0.254 </screen>

	    Wenn Sie eine Zeile wie die letzte sehen, dann arbeitet DHCP richtig
	    und der Fehler muss woanders liegen (TFTP). 
        </para>

        <para>
	    Umgekehrt ist etwas falsch, wenn die folgende Meldung erscheint und
	    danach jede Menge &#60;sleep&#62; Meldungen erscheinen. Normal sind ein bis zwei
            &#60;sleep&#62; Meldungen bis der DHCP-Server antwortet.
            <screen>
Searching for server (DHCP)...  </screen>
        </para>

        <para>
	    Die Fehlerursache herauszufinden kann schwierig sein, hier ein paar Hinweise:
        </para>
            <sect2>
                <title>Verbindungen überprüfen</title>
                <para>
            	    Ist der Client physikalisch richtig an dasselbe Netz wie
		    der Server angeschlossen?    
                </para>
                <para>
		    Kontrollieren Sie nach dem Einschalten des Clients, 
		    ob die 'link'-LEDs überall aufleuchten.
                </para>

                <para>
		    Bei einer Direktverbindung zwischen Server und Client muss
		    ein cross-Kabel verwendet werden, bei Einsatz von Hub oder
		    Switch ausschließlich normale Patchkabel.
                </para>

            </sect2>

            <sect2>
                <title>Arbeitet dhcpd?</title>
                <para>
		    Stellen Sie fest, ob der <command>dhcpd</command> Prozess auf dem Server läuft.
		    Dazu gibt es mehrere Möglichkeiten:		    
                </para>

                <para>
                    <command>dhcpd</command> läuft normalerweise im Hintergrund
                    und wartet auf dem udp-Port 67 auf Anfragen.
		    Führen Sie das Kommando
                    <command>netstat</command> aus, um zu sehen, ob der Prozess vorhanden ist:
                    <programlisting>
			netstat -an | grep ":67 " 
		    </programlisting>
                    Es sollte etwa folgendes zu sehen sein:
                    <programlisting>
			udp     0    0   0.0.0.0:67         0.0.0.0:*
		    </programlisting>
                    Die vierte Spalte zeigt, getrennt durch Doppelpunkt, die
		    IP-Adresse und den Port an. überall Nullen zeigen an,
		    dass auf allen Netzwerkkarten Anfragen entgegengenommen werden.
                    Gibt es also etwa <command>eth0</command> und
                    <command>eth1</command> dann wartet 
                    <command>dhcpd</command> auf beiden Interfaces auf Anfragen.
                </para>

                <para>
		    Die Tatsache alleine, dass auf Port 67 ein Prozess auf 
		    Anfragen wartet, heißes noch nicht, dass dies
                    <command>dhcpd</command> ist, es könnte auch <command>bootpd</command> sein. 
                </para>

                <para>
		    Um sicherzugehen, dass tatsächlich <command>dhcpd</command>
                    läuft, führen Sie das Kommando <command>ps</command>
                    aus.
                    <programlisting>
			ps aux | grep dhcpd 
		    </programlisting>

                    Dann sollte es etwa so aussehen:

                    <programlisting>
			root 23814 0.0 0.3 1676 820 ?      S 15:13 0:00 /usr/sbin/dhcpd
			root 23834 0.0 0.2 1552 600 pts/0  S 15:52 0:00 grep dhcp 
		    </programlisting>

                    Die erste Zeile zeigt an, dass es der Fall ist.
                </para>

                <para>
		    Wenn Sie keine solche Zeile sehen, dann überprüfen Sie,
		    ob das automatische Starten des dhcp-Servers im runlevel 5 
		    eingestellt ist. Auf Redhat basierenden Systemen kann man dazu das
		    Kommando <command>ntsysv</command> ausführen, in der erscheinenden
		    Liste nach unten scrollen und sich vergewissern, dass <command>dhcpd</command>
		    angekreuzt ist. Wenn Sie SuSE einsetzen geht das entsprechend mit YAST2.
                </para>
                <para>
		    Sie können auch versuchen, den Prozess erst einmal von Hand zu starten.		    		    
		    Kommando bei Redhat:
		    <programlisting>
		    service dhcpd start
		    </programlisting>
		    Und bei SuSE
		    <programlisting>
		    rcdhcp start
		    </programlisting>
		    Achten Sie auf eventuelle Fehlermeldungen. 
		</para>
                
            </sect2>

            <sect2>
                <title>Überprüfen Sie die Konfigurationsdatei</title>
                <para>
                    Gibt es in der Datei <filename>/etc/dhcpd.conf</filename> 
		    einen Eintrag für den Client?
                </para>
                <para>
                    überprüfen Sie insbesondere den  'fixed-address' Teil auf
		    Übereinstimmung mit der Client-Hardware.
                </para>
            </sect2>
           
            <sect2>
                <title>Blockieren ipchains oder iptables die Anfrage?</title>
                <sect3>
                    <title>Checken von ipchains</title>
                    <para>
                        Führen Sie das folgende Kommando aus und beobachten Sie die Ausgabe:
                        <programlisting>
			    ipchains -L -v 
			</programlisting>
                        Wenn Sie etwas wie dies sehen, dann liegt es nicht an ipchains:
                        <programlisting>
			    Chain input (policy ACCEPT: 229714 packets, 115477216 bytes):
			    Chain forward (policy ACCEPT: 10 packets, 1794 bytes):
			    Chain output (policy ACCEPT: 188978 packets, 66087385 bytes): 
		        </programlisting>
                    </para>
                </sect3>
                <sect3>
                    <title>Checken von iptables</title>
                    <para>
                        Führen Sie das folgende Kommando aus und beobachten Sie die Ausgabe:
                        <programlisting>
			    iptables -L -v 
			</programlisting>
                        Wenn Sie etwas wie dies sehen, dann liegt es nicht an ipchains:
                        <programlisting>
			    Chain INPUT (policy ACCEPT 18148 packets, 2623K bytes)
			     pkts bytes target     prot opt in     out     source               destination

			    Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
			     pkts bytes target     prot opt in     out     source               destination

			    Chain OUTPUT (policy ACCEPT 17721 packets, 2732K bytes)
			     pkts bytes target     prot opt in     out     source               destination</programlisting>
                    </para>
                </sect3>
            </sect2>
           
            <sect2>
                <title>Sendet der Client die Anfrage?</title>
                <para>
                    Beobachten Sie auf dem Server die Datei 
		    <filename>/var/log/messages</filename>
                    während der Client bootet.
		    Das geht so:
                    <programlisting>
			tail -f /var/log/messages 
		    </programlisting>
                    Damit blättert der Dateiinhalt vor sich hin, jeder neue Eintrag wird
		    sofort angezeigt.
                    <programlisting>
			server dhcpd: DHCPDISCOVER from 00:50:56:81:00:01 via eth0
			server dhcpd: no free leases on subnet WORKSTATIONS
			server dhcpd: DHCPDISCOVER from 00:50:56:81:00:01 via eth0
			server dhcpd: no free leases on subnet WORKSTATIONS 
		    </programlisting>
	            Eine solche Meldung besagt, das <command>dhcpd</command>
		    läuft, aber nichts über die anfragende Maschine weiß. Kontrollieren Sie 
		    die Einträge für den Client in /etc/dhcpd.conf.
                </para>
            </sect2>
           
    </sect1>

    <sect1>
        <title>Fehlersuche TFTP</title>
        <para>
            Etherboot benutzt TFTP, um den Linux-Kernel vom Server zu laden.
	    Es handelt sich um ein ziemlich einfaches Protokoll; TFTP macht aber
	    manchmal Probleme.
        </para>

        <para>
            Wenn Sie auf dem Client beim Startprozess folgendes sehen:
        <screen>
	    Loading 192.168.0.254:/lts/vmlinuz-2.4.9-ltsp-5 | 
	</screen>
        und dabei das letzte Zeichen der Zeile (das '|') schnell zwischen
          den Zeichen '|', '\', '-' and '/' wechselt, dann zeigt dies an, dass
	  der Kernel geladen wird. TFTP sollte damit richtig laufen.
        </para>

        <para>
          Sieht man diesen Zeichenwechsel nicht, zeigt das ein Problem an.
	  Möglicherweise ist dies falsch:
        </para>

        <sect2>
            <title><command>tftpd</command> läuft nicht</title>
            <para>
                Unter Redhat 7.1 wird tftp von <command>xinetd</command> gestartet.
		Es gibt ein Startscript namens <filename>/etc/xinetd.d/tftp</filename>,
		welches Informationen für den <command>tftpd</command> Prozess enthält.
            </para>
        </sect2>

        <sect2>
            <title>Kernel nicht an der von tftpd erwarteten Stelle</title>
            <para>
		Der Kernel muss an einer Stelle liegen, auf die <command>tftpd</command> zugreifen kann.
                Wenn zum Starten von <command>tftpd</command> die  '-s' Option 
		benutzt wird, dann müssen alle angegebenen Dateinamen relativ zu
                <filename class="directory">/tftpboot</filename> sein.
		Beispielsweise muss der Kernel <filename>/tftpboot/lts/vmlinuz-2.4.9-ltsp-5</filename> sein, 
		wenn der <command>filename</command> Eintrag in der Datei
                <filename>/etc/dhcpd.conf</filename> auf 
                <filename>/lts/vmlinuz-2.4.9-ltsp-5</filename> lautet.
            </para>
        </sect2>
    </sect1>

<!--
    <sect1>
        <title>Fehlersuche  Kernel</title>
        <para>
    	    Wenn Sie einen der LTSP-Standard-Kernel verwenden, dann müssen Sie 
	    nur darauf achten, den für die Hardware des Clients richtigen
	    Kernel zu nehmen, insbesondere muss die Netzwerkkarte unterstützt 
	    werden.    
        </para>

        <para>
            Der Standard-Kernel <command>vmlinuz.ltsp</command>
            enthält Treiber für alle von Linux unterstützten Netzwerkkarten.
        </para>

        <para>
	    Ein guter Hinweis für einen falschen Kernel ist solch eine Meldung:
            <screen>
		.
		.
		.
		RAM disk driver initialized:  16 RAM disks of 1024K size
		IP-Config: No Network devices available
		Root-NFS: No NFS server available, giving up.
		VFS: Unable to mount root fs via NFS, trying floppy.
		VFS: Cannot open root device 02:00
		Kernel panic: VFS: Unable to mount root fs on 02:00 
	    </screen>

            Manche Leute stolpern über den "NFS"-Fehler, überlesen aber die
	    Meldung <command>No Network devices available</command>.
	    Das aber ist der Fehler: Der Kernel kann die Netzwerkkarte nicht initialisieren,
	    weil kein Treiber einkompiliert ist bzw. als 'module' zu Verfügung steht.
        </para>
    </sect1>
-->

    <sect1>
        <title>Fehlersuche root-Dateisystem per NFS</title>
        <para>
	    Es gibt mehrere Dinge, die dem Mounten des root-Dateisystems
	    im Wege stehen können:
        </para>
        <sect2>
            <title>Der init Prozess fehlt</title>
            <para>
                Bei der folgenden Fehlermeldung:
                <screen>
		    Kernel panic: No init found.  Try passing init= option to kernel.  
		</screen>
                ist es sehr wahrscheinlich, dass entweder versucht wird, ein
		falsches root-Dateisystem zu mounten oder dass das 'richtige'
		Verzeichnis leer ist.
            </para>
        </sect2>

        <sect2>
            <title>Der Server meldet 'error -13'</title>
            <para>
                Die Fehlermeldung:
                <screen>
		    Root-NFS: Server returned error -13 while mounting /opt/ltsp/i386 
		</screen>
                zeigt an, dass entweder das Verzeichnis
                <filename class="directory">/opt/ltsp/i386</filename>
                nicht in der Datei <filename>/etc/exports</filename>
                enthalten ist oder dort fehlerhaft eingetragen wurde.
            </para>
            <para>
                Sehen Sie in der Datei <filename>/var/log/messages</filename> 
		nach irgendwelchen Hinweisen. Ein Eintrag wie dieser:
                <screen>
		    Jul 20 00:28:39 jamlap rpc.mountd: refused mount request from ws004
                      for /opt/ltsp/i386 (/): no export entry 
		</screen>
                bestätigt z.B. den Verdacht, dass der Eintrag 
                <filename>/etc/exports</filename> falsch ist.
            </para>
        </sect2>

        <sect2>
            <title>NFS Daemon Probleme (portmap, nfsd &amp; mountd)</title>
            <para>
		Es kann schwierig sein, NFS-Fehler aufzuspüren.
		Wenn man versteht, was konfiguriert werden muss und welche
		Diagnosetools zur Verfügung stehen, wird es wohl etwas einfacher.
            </para>
            <para>
		Auf dem Server müssen drei Prozesse laufen, damit NFS richtig
		funktioniert. Dies sind:
		<command>portmap</command>,
                <command>nfsd</command> und <command>mountd</command>.
            </para>
            <sect3>
                <title>Der Portmapper (portmap)</title>
                <para>
                    Bei diesen Meldungen:
                    <screen>
			Looking up port of RPC 100003/2 on 192.168.0.254
			portmap: server 192.168.0.254 not responding, timed out
			Root-NFS: Unable to get nfsd port number from server, using default
			Looking up port of RPC 100005/2 on 192.168.0.254
			portmap: server 192.168.0.254 not responding, timed out
			Root-NFS: Unable to get mountd port number from server, using default
			mount: server 192.168.0.254 not responding, timed out
			Root-NFS: Server returned error -5 while mounting /opt/ltsp/i386
			VFS: unable to mount root fs via NFS, trying floppy.
			VFS: Cannot open root device "nfs" or 02:00
			Please append a correct "root=" boot option
			Kernel panic: VFS: Unable to mount root fs on 02:00 
		    </screen>
                    kann man vermuten, dass der Portmapper <command>portmap</command>
                    nicht läuft. Feststellen lässt sich dies durch das  <command>ps</command>
                    Kommando:
                    <screen>
			ps -e | grep portmap 
		    </screen>
                    Bei laufendem Portmapper sieht man dies:
                    <screen>
			30455 ?        00:00:00 portmap 
		    </screen>
                    Eine weitere Testmöglichkeit bietet das <command>netstat</command>
		    Kommando.
                    Der Portmapper benutzt die TCP und UDP Ports 111.  
		    Führt man folgendes aus:
                    <screen>
			netstat -an | grep ":111 " 
		    </screen>
                    dann sollte dies zu sehen sein:
                    <screen>
			tcp   0   0 0.0.0.0:111       0.0.0.0:*          LISTEN      
			udp   0   0 0.0.0.0:111       0.0.0.0:*                           
		    </screen>
	            Sieht man nichts, dann läuft der Portmapper auch nicht.
		    Starten per Hand geht so:
                    <screen>
			/etc/rc.d/init.d/portmap   start 
		    </screen>
		    oder bei neuerer SuSE-Distribution:
		    <screen>
			rcportmap   start 
		    </screen>
                    Fall so der Portmapper ans Laufen gebracht werden kann, dann
		    sollten Sie nun einstellen, dass er beim Hochfahren des Servers
		    automatisch gestartet wird.
		    Unter Redhat benutzen Sie dazu das Kommando 
                    <command>ntsysv</command>, unter SuSE YAST oder YAST2.
                </para>
            </sect3>

            <sect3>
                <title>Die Prozesse NFS und MOUNT (nfsd &amp; mountd)</title>
                <para>
                    Für NFS müssen zwei Prozesse laufen:
                    <command>nfsd</command> und <command>mountd</command>.
                    Beide werden durch das Script
                    <filename>/etc/rc.d/init.d/nfs</filename> gestartet.
                </para>
                <para>
                    Mit dem Kommando <command>ps</command> können Sie 
		    feststellen, ob beide Prozesse laufen.
                    <screen>
			ps -e | grep nfs
			ps -e | grep mountd 
		    </screen>
                    Falls einer oder beide nicht laufen, dann müssen diese nun
		    gestartet werden.
                </para>

                <para>
            	    Eigentlich sollte hier das    
                    <command>restart</command> Argument 
		    nutzbar sein, aber auf diese Weise wird 
                    kein Neustart von <command>nfsd</command> erfolgen
		    (Bug?). Deshalb muss man folgendes tun:
                    <screen>
			/etc/rc.d/init.d/nfs  stop
			/etc/rc.d/init.d/nfs  start 
		    </screen>
                    Vielleicht gibt es Fehlermeldungen des <command>stop</command> Kommandos,
                    aber das ist normal.
		    Das <command>start</command> sollte allerdings <command>o.k.</command> zurückgeben.
                </para>

                <para>
            	    Wenn die Prozesse laufen, NFS aber immer noch nicht klappt,
		    dann kann mit dem <command>rpcinfo</command> Kommando feststellen,
		    ob sie sich auch beim Portmapper angemeldet haben.
                    <screen>
			rpcinfo -p localhost 
		    </screen>
                    Man sollte etwas wie dies sehen:
                    <screen>
			program vers proto   port
			 100000    2   tcp    111  portmapper
			 100000    2   udp    111  portmapper
			 100011    1   udp    856  rquotad
			 100011    2   udp    856  rquotad
			 100005    1   udp   1104  mountd
			 100005    1   tcp   2531  mountd
			 100005    2   udp   1104  mountd
			 100005    2   tcp   2531  mountd
			 100003    2   udp   2049  nfs 
		    </screen>
                    Dies zeigt an, das <command>nfs</command> (nfsd) und
                    <command>mountd</command> laufen und sich beim Portmapper
                    registriert haben.
                </para>
            </sect3>
        </sect2>
    </sect1>

    <sect1>
        <title>Fehlersuche X-Server</title>
        <para>
            Teufel auch! Die schwierigste Einzelaufgabe ist wahrscheinlich
	    das richtige Konfigurieren des X-Servers.
	    Bei halbwegs neuer, von Linux unterstützter Graphikkarte und  
	    einem Monitor, der viele Frequenz- und Auflösungseinstellungen
	    beherrscht ist es kein Problem. Falls es nicht klappt liegt es
	    meist am falschen X-Server für die Karte.
        </para>
        <para>
	    Es lässt sich einfach feststellen, ob es der falsche X-Server ist:
	    Entweder bricht der Start des Servers mit Fehlermeldungen ab
	    oder die Anzeige sieht verzerrt oder irgendwie komisch aus. 
        </para>
        <para>
	    Auf dem Client wird der X-Server durch das Script  
            <filename>/tmp/start_ws</filename> gestartet. Dies geschieht
	    in runlevel 5 als letzter Schritt des Startvorganges automatisch
	    kann aber auch im runlevel 3 per Hand ausgeführt werden.
	    Das Script startet den X-Server mit der 
            <command>-query</command> Option, die auf einen Rechner verweist,
            auf dem ein Display-Manager wie <command>XDM</command>,
            <command>GDM</command> oder <command>KDM</command> läuft.
        </para>

        <para>
	    Da der X-Server durch das Script <filename>/tmp/start_ws</filename>
            gestartet wird, das Script selbst aber durch <command>init</command>,
	    wird das <command>init</command> 10 mal versuchen, den X-Server zu starten
	    bevor es aufgibt ("respawning too fast"). 
	    Wenn man bis dahin noch nicht den Client-Rechner abgeschaltet hat,
	    wird man die Fehlermeldung des X-Servers auf dem Monitor finden.
        </para>

        <para>
	    10 mal zu sehen, wie der X-Server es nicht schafft kann ziemlich 
	    irritierend sein. Da startet man den Rechner doch lieber im runlevel 3,
	    so dass kein automatischer Start des X-Servers erfolgt.
	    Im runlevel 3 hat man nach dem Start einen shell-Prompt der
            <command>bash</command>.
	    Der X-Server kann nun manuell gestartet werden:
            <screen>
		/tmp/start_ws 
	    </screen>
	    Statt nach 10 Versuchen gibt der X-Server nun nach einem auf und die
	    Fehlermeldungen lassen sich nachlesen. 
        </para>
    </sect1>

    <sect1>
        <title>Fehlersuche Display-Manager</title>
        <para>
	    Der Display-Manager ist ein auf dem Server laufender Prozess, der darauf
	    wartet, von einem X-Server kontaktiert zu werden.
	    Wenn dies passiert, dann schickt der Prozess ein Anmeldefenster 
	    auf den Bildschirm der Maschine, auf dem der anfragende X-Server läuft.
	    Benutzer können sich nun zur Nutzung von Programmen des Servers anmelden.
        </para>

        <para>
            Die drei am häufigsten benutzten Display-Manager sind:
            <itemizedlist>
                <listitem>
                    <para>
                        XDM - Den gibt es schon seit ewigen Zeiten. Er gehört zum X Window System.
                    </para>
                </listitem>
                <listitem>
                    <para>
                        GDM - Der 'Gnome Display-Manager'. Dieser gehört zum gnome-Paket.
                    </para>
                </listitem>
                <listitem>
                    <para>
                        KDM - Der 'KDE Display Manager'.  Und dieser ist Teil des KDE-Desktop-Systems
                    </para>
                </listitem>
            </itemizedlist>
            Neuere GNU/Linux Distributionen haben alle drei im Angebot.
        </para>

        <sect2>
            <title>Grauer Bildschirm mit großem Cursor in Form eines X</title>
            <para>
        	Dies bedeutet, dass der X-Server läuft, aber keinen Kontakt zu einem
		Display-Manager herstellen konnte.    
                Mögliche Gründe:
                <orderedlist>
                    <listitem>
                        <para>
                            Auf dem angesprochenen Rechner läuft kein Display-Manager
                        </para>
                        <para>
                            Neuere Versionen von Redhat (7.0 und höher), haben den Start
                            des Display-Managers in den <command>init</command> Prozess integriert.
                            In der Datei
                            <filename>/etc/inittab</filename> gibt es eine Zeile,
                            die so aussieht:
                            <screen>
				x:5:respawn:/etc/X11/prefdm -nodaemon 
			    </screen>
                            Das <command>prefdm</command> Script legt fest,
                            welcher Display-Manager gestartet werden soll.
                        </para>

                        <para>
                    	    Welches der voreingestellte Display-Manager ist, hängt
			    von den installierten Paketen ab.    
                            Ist Gnome installiert, dann ist GDM voreingestellt.
                            Falls Gnome nicht installiert ist, prüft das prefdm-Script
			    ob KDE installiert ist.  Im zutreffenden Fall wird KDM 
			    als Display-Manager voreingestellt.
			    Ist KDE ebenfalls nicht installiert, dann wird
                            GDM zum voreingestellten Display-Manager.
                        </para>

                        <para>
                            Mittels des <command>netstat</command> Kommandos,
                            lässt sich feststellen, welcher Display-Manager läuft.
                            Auf dem Server gibt man folgenden Befehl ein:
                            <screen>
				netstat -ap | grep xdmcp 
			    </screen>
                            Es sollte zu sehen sein, dass ein Prozess auf dem
			    xdmcp-Port (177) auf Anfragen wartet.
                            <screen>
				udp     0   0 *:xdmcp            *:*               1493/gdm 
			    </screen>
                            Man sieht hier, dass <command>gdm</command>
                            mit der PID 1493 läuft und auf dem xdmcp-Port bereit steht.
                        </para>

                        <para>
			    Falls solch eine Zeile zu sehen ist, muss als nächstes nachgesehen werden,
			    ob der Client die XDMCP-Anfrage an den richtigen Server stellt.
                        </para>

                        <para>
                            In der Datei <filename>lts.conf</filename> lässt sich
                            die IP-Adresse des Servers angeben, dessen Display-Manager um ein
			    graphisches Login angefragt werden soll.
			    Der Eintrag ist optional. Falls er vorhanden ist, sollte er so aussehen:
                            <screen>
				XDM_SERVER  =  192.168.0.254 
			    </screen>
                            Die IP-Adresse kann in Ihrem Fall natürlich anders sein.
                        </para>

                        <para>
                            Wenn der Eintrag 'XDM_SERVER' nicht vorhanden ist,
			    dann wird der Eintrag 'SERVER' benutzt. Ist auch dieser nicht vorhanden, wird
                            <command>192.168.0.254</command> genommen.
                        </para>

                        <para>
                    	    Was auch immer angegeben wird, es muss sich um die richtige
			    IP-Adresse des Rechners handeln, auf dem der Display-Manager läuft.    
                        </para>
                    </listitem>
                    <listitem>
                        <para>
			    Möglicherweise ist der Display-Manager so konfiguriert, dass Anfragen
			    anderer Rechner aus Sicherheitsgründen abgewiesen werden.
                        </para>

                        <para>
			    Wenn Sie sicher sind, dass der Display-Manager läuft,
			    dann prüfen Sie nun, ob der Display-Manager vielleicht so
			    wie gerade erwähnt konfiguriert wurde.
                        </para>

                        <itemizedlist>
                            <listitem>
                                <para><command>XDM</command></para>
                                <para>
                                    Bei Redhat ist voreingestellt, dass Anfragen
                                    von anderen Rechnern abgelehnt werden, bei neueren SuSE-Distributionen
				    ebenfalls. 
                                    Das weit oben erwähnte Script <command>ltsp_initialize</command>
                                    sollte eigentlich die notwendige Änderung an den 
				    Konfigurationsdateien vorgenommen haben.
                                    Wenn Sie keinen Zugang bekommen, sehen Sie aber besser einmal in der Datei
                                    <filename>/etc/X11/xdm/xdm-config</filename>
                                    nach. Suchen Sie nach einem Eintrag, der etwa so aussieht:
                                    <screen>
					DisplayManager.requestPort:     0 
				    </screen>
                                    Diese Zeile muss unbedingt auskommentiert werden, damit
				    Anfragen anderer Rechner entgegengenommen werden.
                                </para>
                                <para>
				    Damit XDM Anfragen anderer Rechner bedienen kann, ist
				    noch der Inhalt einer weiteren Datei von Bedeutung:
                                    <filename>/etc/X11/xdm/Xaccess</filename>.
                                    In dieser Datei muss es unbedingt eine Zeile geben, die mit
				    dem Zeichen '*' beginnt.
				    Normalerweise gibt es diese Zeile, bei Redhat ist sie allerdings
				    auskommentiert. Das
                                    <command>ltsp_initialize</command> Script
                                    sollte hier für den richtigen Eintrag gesorgt haben,
				    aber sehen Sie bei Problemen auch in dieser Datei  nach.
                                    Eigentlich sollte dort solch eine Zeile zu sehen sein:
                                    <screen>
					*        #any host can get a login window 
				    </screen>
                                </para>
                            </listitem>

                            <listitem>
                                <para><command>KDM</command></para>
                                <para>
                            	    Neuere Versionen von KDM benutzen eine Datei namens    
                                    <command>kdmrc</command>.
				    Leider legen die verschiedenen Linux-Distributionen
				    diese Konfigurationsdatei an unterschiedlichen Positionen ab;
	        		    Redhat 7.2 z.B. unter <command>/etc/kde/kdm/kdmrc</command>.
                                    Am besten benutzen Sie bei anderen Distributionen das Kommando
                                    <command>locate kdmrc</command>, um die Datei zu lokalisieren.
                                </para>
                                <para>
                                    Die Zugangskontrolle wird in dieser Datei in der Sektion
                                    <command>[Xdmcp]</command> festgelegt.
                                    Kontrollieren Sie, ob <command>Enable</command>
                                    auf <command>true</command> gesetzt ist.
                                </para>
                                <para>
                            	    ältere KDM-Versionen benutzen die XDM-Konfigurationsdateien,
				    die im Verzeichnis <filename class="directory">/etc/X11/xdm</filename> zu finden sind.
                                </para>
                            </listitem>

                            <listitem>
                                <para><command>GDM</command></para>
                                <para>
                                    GDM benutzt andere Konfigurationsdateien. 
                                    Diese befinden sich im Verzeichnis <filename class="directory">/etc/X11/gdm</filename>.
                                </para>

                                <para>
                            	    Kontrollieren Sie in der Hauptdatei    
                                    <filename>gdm.conf</filename> den Abschnitt
                                    <command>[xdmcp]</command>.  Dort sollte ein Eintrag
				    'Enable' zu sehen sein.  Dieser
                                    muss - je nach GDM-Version - auf '1' oder 'true'
                                    gesetzt sein, wie in diesem Beispiel:
                                    <screen>
					[xdmcp]
					Enable=true
					HonorIndirect=0
					MaxPending=4
					MaxPendingIndirect=4
					MaxSessions=16
					MaxWait=30
					MaxWaitIndirect=30
					Port=177 
				    </screen>
                                </para>
                                <para>
                            	    Beachten Sie die Zeile mit    
				    'Enable=true'.
                                    ältere Versionen von GDM benutzen '0' und '1',
				    neuere 'false' und 'true' für die Zugangskontrolle.
                                </para>
                            </listitem>
                        </itemizedlist>
                    </listitem>

                    <listitem>
                        <para>
			    Wenn feststeht, dass der Display-Manager läuft und auch
			    so konfiguriert ist, dass Anfragen fremder Rechner akzeptiert werden,
			    dann kann die Fehlerursache noch folgende sein:
			    Die Zuordnung von IP-Adressen zu Rechnernamen stimmt nicht.
			    Der Name des Client-Rechners muss entweder in der Datei 
                            <filename>/etc/hosts</filename> enthalten sein
			    oder einen gültigen Eintrag in den Nameserver-Dateien haben. 
                        </para>
                    </listitem>

                </orderedlist>
            </para>
        </sect2>
    </sect1>
</chapter>

<chapter>
    <title>Kernel</title>
    <para>
	Bei dem Kernel, der auf dem Client laufen soll, kann man einen
	der vorbereiteten Kernel benutzen, die per Download verfügbar sind,
	man kann aber auch einen eigenen Kernel konfigurieren und kompilieren.

        Außerdem hat man die Wahl, ob beim Booten nur Textmeldungen oder
	ein Bild mit Fortschrittsbalken angezeigt werden soll.
	Letztere Variante wird durch den <command>Linux Progress Patch (LPP)</command>
	ermöglicht, allerdings nicht bei sehr alten Grafikkarten, da diese
	nicht über den erforderlichen VESA Modus verfügen.
    </para>

    <sect1>
        <title>Standard LTSP Kernel</title>
        <para>
		Das Kernel-Paket von LTSP 3.0 enthält 2 Kernel, einen mit
		Linux Progress Patch und einen ohne.
        </para>

        <para>
		Beide Kernel enthalten bereits den Patch, der Swap über NFS
		ermöglicht.
        </para>
    </sect1>

    <sect1>
        <title>Einen Kernel selbst kompilieren</title>

        <para>
		Es gibt 2 Wege, einen Kernel für LTSP zu konfigurieren:

		Die übliche Methode ist die Verwendung einer 'Initial Ram Disk'
		abgekürzt:<command>initrd</command> . Das initrd Image ist ein
		kleines Dateisystem, welches an die Kerneldatei angehängt wird.
		Das initrd Dateisystem wird in den Arbeitsspeicher geladen
		und wenn ein Kernel gebootet hat, mountet er diese RAM-Disk
		als root-Dateisystem. initrd bietet einige Vorteile:
		Wir können die Netzwerkkarten-Treiber als Modul kompilieren
		und beim Booten den passenden Treiber laden.
		Dies ermöglicht einen einzigen Kernel zu haben, der prinzipiell
		alle Netzwerkkarten unterstützt.
		Der andere Vorteil besteht darin, dass wir den DHCP-Client
		als "user-space"-Programm laufen lassen können, statt im
		"Kernel-space". Das DHCP Client-Programm im "user-space" laufen
		zu lassen ermöglicht eine bessere Kontrolle durch DHCP-Optionen,
		die vom Client angefordert und vom Server gesendet werden.
		Außerdem macht es den Kernel etwas kleiner.

		Der andere Weg, den Kernel zu konfigurieren ist, ohne initrd.
		Ein Kernel ohne initrd erfordert, dass der Netzwerkkarte-Treiber
		fest in den Kernel einkompiliert wird. Außerdem werden die
		Kernel-config Optionen "IP-Autoconfig" und "Root filesystem on NFS"
		benötigt.

		Ein Kernel ohne initrd ist etwas kleiner und bootet ein wenig schneller.
		Nachdem der Client-PC gebootet ist, gibt es im laufenden Betrieb
		aber praktisch keinen Unterschied mehr.
        </para>

        <para>
		Der Standard-Kernel des LTSP enthält eine initrd, welche die
		Erkennung der Netzwerkkarte übernimmt und eine "user-space"
		DHCP Anfrage sendet.
		Es war ein wichtiges Ziel, dieses initrd-Image so klein wie
		möglich zu machen. Daher haben wir "uClinux" als Ersatz für
		die libc-library und "busybox" für die Tools verwendet.
        </para>

        <para>
		Wenn Sie eigene Kernel kompilieren wollen, sollten Sie das
		Paket ltsp_initrd_kit herunterladen. Es beinhaltet das
		root-filesystem und ein Script, um ein Image zu erzeugen.
        </para>

        <sect2>
            <title>Woher bekommt man die Kernel-Quellen?</title>

            <para>
		Wenn man sich einen eigenen Kernel baut, sollte man mit
		frischen, unveränderten Kernel-Quellen von
		<command>ftp.kernel.org</command> beginnen.
		Der Grund dafür ist, dass die Distributionen, wie z.B.
		SuSE & RedHat, viele Patches zum Kernel hinzufügen,
		sodass deren Kernel-Quellen sich vom offiziellen Kernel
		unterscheiden.
            </para>

            <para>
		Besorgen Sie sich das gewünschte Kernel-Paket und speichern Sie es unter
 		<filename class="directory">/usr/src</filename> .
		Die Kernel findet man unter <filename class="directory">/pub/linux/Kernel</filename>
		auf ftp.kernel.org.
		Wir benötigen einen aktuellen 2.4.x Kernel, damit das <command>devfs</command>
		Dateisystem unterstützt wird.
            </para>

            <para>
		Wenn Sie NFS swapping oder Linux Progress Patch (LPP) benötigen,
		müssen Sie sicherstellen, dass die Patches zur Kernelversion passen.
		zur Zeit ist 2.4.9 die neueste Kernel Version, welche diese
		Features unterstützt.
            </para>

            <para>
		Für unser Beispiel werden wir den Kerlen 2.4.9 verwenden.
		Der Download-Pfad lautet:
                <filename>ftp://ftp.kernel.org/pub/linux/Kernel/v2.4/linux-2.4.9.tar.bz2</filename>
            </para>

            <para>
		Packen Sie das Paket in <filename class="directory">/usr/src</filename>
		aus. Vorsicht: nach dem Auspacken befinden sich die Quellen
		in einem Verzeichnis mit dem Namen <filename>linux</filename> .
		Eventuell existiert bereits ein gleichnamiges Verzeichnis
		mit anderem Inhalt, und wir wollen das ja nicht vermischen.
		Deshalb sollten Sie prüfen, ob es schon ein Verzeichnis <filename>linux</filename>
		oder einen entsprechenden symbolischen Link gibt und dieses gegebenenfalls
		umbenennen oder verschieben, bevor Sie die neuen Quellen ausparken.
            </para>

            <para>
		Das Quellpaket wurde mit <command>bzip2</command> komprimiert.
		Deshalb müssen wir es erst dekomprimieren bevor wir es mit <command>tar</command>
		auspacken:

                <screen>
		bunzip2 &#60;linux-2.4.9.tar.bz2 | tar xf -
		</screen>
		Nach dem Auspacken haben Sie ein Verzeichnis mit dem Namen <filename>linux</filename>
		welches den gesamten Sourcebaum enthält.
		Zu diesem Zeitpunkt gebe ich dem Verzeichnis üblicherweise einen
		aussagekräftigen Namen.

                <screen>
mv linux linux-2.4.9 </screen>

		Nachdem das Verzeichnis umbenannt wurde, wechseln Sie hinein:

                <screen>
cd linux-2.4.9 </screen>
            </para>
            <para>
		Üblicherweise ändere ich das <filename>Makefile</filename>
		bevor ich mit der Kernel-Konfiguration beginne.
		Ziemlich weit oben gibt es eine Variable mit dem Namen
		<command>EXTRAVERSION</command>. Diese stelle ich auf
		'-ltsp-1' , sodass die Versionsnummer des neuen Kernels
		'2.4.9-ltsp-1' sein wird. Dies macht später die Unterscheidung
		einfacher. Der Anfang des Makefiles sollte dann so aussehen:
                <screen>
VERSION = 2
PATCHLEVEL = 4
SUBLEVEL = 9
EXTRAVERSION = -ltsp-1

KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) </screen>
            </para>
        </sect2>

        <sect2>
            <title>Kernel Patches</title>
            <para>
		Nach dem Auspacken des Kernels haben Sie möglicherweise diverse
		Patches, die Sie einfügen wollen. Zum Beispiel den NFS-Swap
		Patch oder den Linux Progress Patch. Man muss die Kernel-Quellen
		patchen BEVOR man den Kernel konfiguriert.
            </para>
            <sect3>
                <title>NFS Swap Patch</title>
                <para>
			Der NFS Swap Patch ermöglicht das Benutzen einer
			Swap-Datei, welche sich auf einem NFS-Server befindet.
			Üblicherweise wird empfohlen genug RAM einzubauen,
			damit der Client nicht swappen muss. Aber manchmal
			ist es schwierig mehr RAM einzubauen, besonders bei
			älteren Computern. In solchen Fällen macht das
			NFS-swapping aus einem unbrauchbaren Rechner einen
			brauchbaren Rechner.

                </para>
                <para>
			Wenn das aktuelle Verzeichnis /usr/src/linux-2.4.9 ist
			und der Patch sich in /usr/src befindet, kann man mit
			dem folgenden Kommando den Patch testen:

                    <screen>
patch -p1 --dry-run &#60;../linux-2.4.9-nfs-swap.diff </screen>
			So können Sie herausfinden, ob der Patch zum Kernel passt.
			Wenn dieser Probelauf ohne Fehler endet, dann können Sie
			den Patch ohne die Option <command>--dry-run</command>
			in die Quellen einfügen.

                    <screen>
patch -p1 &#60;../linux-2.4.9-nfs-swap.diff </screen>
                </para>
            </sect3>
            <sect3>
                <title>Linux Progress Patch (LPP)</title>
                <para>
                    	Der Linux Progress Patch (LPP) ermöglicht es, dass ein
			graphisches Logo während des Bootens angezeigt wird.
			Die üblichen Boot-Meldungen werden auf eine andere Konsole
			umgeleitet und spezielle Anweisungen in den boot-Scripts
			sorgen dafür, dass ein Fortschrittsbalken den Bootvorgang
			visualisiert.
                </para>
                <para>
			Genau wie beim NFS-Swap-Patch kann man den LPP mit

                    <screen>
patch -p1 --dry-run &#60;../lpp-2.4.9 </screen>

			testen.
			Wenn der Test erfolgreich war, wird der Patch durchgeführt:
                    <screen>
patch -p1 &#60;../lpp-2.4.9 </screen>
                </para>
            </sect3>
        </sect2>

        <sect2>
            <title>Konfiguration von Kernel-Optionen</title>
            <para>
		Nun können Sie das Kernel Konfigurationsprogramm ihrer Wahl starten.
		Zur Wahl stehen:

                <itemizedlist>
                    <listitem>
                        <para>make xconfig</para>
                        <para>
				Dies ist die X Window Version des Kernel-Konfigurationstools
                        </para>
                    </listitem>
                    <listitem>
                        <para>make menuconfig</para>
                        <para>
				Dies ist eine curses basierte Version.

                        </para>
                    </listitem>
                    <listitem>
                        <para>make config</para>
                        <para>
				Das ist die einfache Zeile-für-Zeile Version des Tools.

                        </para>
                    </listitem>
                </itemizedlist>
            </para>

            <sect3>
                <title>Kernel mit initrd konfigurieren</title>
                <para>
			Die Verwendung von initrd erfordert die folgenden Optionen:
                    <itemizedlist>

                        <listitem>
                            <para>
                                File systems -> /dev filesystem support
                            </para>
                            <para>
                                "/dev file system support" muss angewählt werden.
				Es befindet sich in der Rubrik 'File systems'
				(Dateisysteme)
				'Automatically mount at boot' darf NICHT
				eingeschaltet seit, denn das mounten wird
				durch das /linuxrc Script erledigt.

                            </para>
                        </listitem>
                        <listitem>
                            <para>
                                Block devices -> RAM disk support
                            </para>
                            <para>
				LTSP Terminals benötigen RAM-Disk support.
				Dies Option finden Sie in der Rubrik
				'Block devices'
                            </para>
                        </listitem>
                        <listitem>
                            <para>
                                Block devices -> Initial RAM disk (initrd) support
                            </para>
                            <para>
                                Auch diese Option muss aktiviert werden.
                            </para>
                        </listitem>
                        <listitem>
                            <para>
                                Processor type and features -> Processor family
                            </para>
                            <para>
				Sie müssen sicherstellen, dass der Kernel
				auf der CPU des Clients läuft. Dies kann man
				in der Rubrik 'Processor type and features'
				einstellen.
				SMP-support sollten Sie abschalten, es sei
				denn, ihr Client hat tatsächlich mehrere
				CPUs.
                            </para>
                        </listitem>
                        <listitem>
                            <para>
                                File systems -> Network file systems -> NFS
                                Client support
                            </para>
                            <para>
				Der Client wird sein Dateisystem via NFS mounten.
				Also muss diese Option aktiviert werden.
                            </para>
                        </listitem>
                    </itemizedlist>
		    Dies waren die benötigten Optionen. Sie können noch viele
		    Optionen abschalten, um die Größe des Kernels zu reduzieren.

                </para>
            </sect3>

            <sect3>
                <title>Kernel ohne initrd konfigurieren</title>
                <para>
			Das Konfigurieren eines Kernel ohne initrd unterscheidet
			sich vom Kernel mit initrd in einigen Punkten:
                    <itemizedlist>
                        <listitem>
                            <para>
                                Block devices -> RAM disk support
                            </para>
                            <para>
				LTSP Terminals benötigen RAM-Disk support.

                            </para>
                        </listitem>

                        <listitem>
                            <para>
                                Block devices -> Initial RAM disk (initrd) support
                            </para>
                            <para>
                                Dies wird abgeschaltet
                            </para>
                        </listitem>
                        <listitem>
                            <para>
                                Networking options -> IP:Kernel level
                                autoconfiguration
                            </para>
                            <para>
			    	Diese Option muss eingeschaltet werden.
				Dadurch konfiguriert der Kernel beim Booten
				automatisch die Ethernet-Schnittstelle eth0
				anhand von Kernel-Bootparametern.
                            </para>
                            <para>
				Es ist nicht nötig die DHCP, BOOTP oder RARP
				Optionen zu aktivieren, da der Etherboot-Code
				bereits eine DHCP oder BOOTP Anfrage gemacht hat
				und die IP-Parameter über die Kommandozeile
				an den Kernel übergibt.
				Deswegen muss der Kernel selbst keine eigene Anfrage mehr
				starten.
                            </para>
                        </listitem>
                        <listitem>
                            <para>
                                Network Device support -> Ethernet (10 or
                                100Mbit)
                            </para>
                            <para>
				Wenn man auf initrd verzichtet, muss man
				einen bestimmten Netzwerkkarten-Treiber
				auswählen, der zur im Client verwendeten
				Netzwerkkarte passt.
				Dieser Treiber MUSS fest einkompiliert werden,
				weil die Ethernet Schnittstelle benötigt wird,
				bevor das root-Dateisystem gemountet wird.
				Dies ist der Unterschied zu einem Kernel mit initrd.

                            </para>
                        </listitem>
                        <listitem>
                            <para>
                                File systems -> /dev filesystem support
                            </para>
                            <para>
                                Seit LTSP Version 2.09pre2 wird
                                <command>devfs</command>
                                benötigt, egal ob mit oder ohne initrd.
                            </para>
                        </listitem>
                        <listitem>
                            <para>
                                File systems -> Automatically mount at boot
                            </para>
                            <para>
			    	Wenn KEINE initrd verwendet wird, dann muss das
        			/dev Dateisystem beim Booten vom Kernel gemountet
				werden. Also muss diese Option aktiviert werden.
                            </para>
                        </listitem>
                        <listitem>
                            <para>
                                File systems -> Network file systems -> NFS
                                Client support
                            </para>
                            <para>
			    	Der Client wird sein root-Dateisystem per NFS
				mounten, also ist "NFS client support" nötig.
                            </para>
                        </listitem>
                    </itemizedlist>
                </para>
            </sect3>
        </sect2>

        <sect2>
            <title>Den Kernel kompilieren</title>

            <para>
	    	Um die Arbeit zu erleichtern, befindet sich eine Kopie der
                <filename>.config</filename> Datei im ltsp_initrd_kit Paket.
		Sie können diese ins Verzeichnis <filename>/usr/src/linux-2.4.9</filename>
                kopieren.
		Aber Vorsicht, überschreiben Sie nicht die Einstellungen, die Sie
		gerade selbst gemacht haben.
            </para>

            <para>
		Nachdem Sie alle gewünschten Kernel-Optionen an- und abgewählt
		haben, können Sie den Kernel kompilieren:
                <screen>
make dep
make clean
make bzImage
make modules
make modules_install </screen>

		Man kann diese Kommandos auch in einer Zeile zusammenfügen:
                <screen>
make dep &amp;&amp; make clean &amp;&amp; make bzImage &amp;&amp; make modules &amp;&amp; make modules_install
</screen>
		Das doppelte &amp; bedeutet, dass das hintere Kommando erst gestartet wird,
		wenn das vordere erfolgreich ausgeführt wurde.
            </para>
            <para>
	        Nach dem Kompilieren des Kernels befindet sich der neue Kernel in
                <filename class="directory">/usr/src/linux-2.4.7/arch/i386/boot/bzImage</filename>.
            </para>
        </sect2>

        <sect2>
            <title>Den Kernel für Etherboot markieren (Tagging)</title>
            <para>
		Damit Etherboot mit dem Kernel umgehen kann, muss er präpariert
		werden. Das nennt man 'Kernel tagging'. Das Tagging fügt zusätzlichen
		Code zum Kernel hinzu, der ausgeführt wird, bevor die Kontrolle
		an den Kernel übergeben wird. Das Programm für's Kernel-Tagging heißt
		 '<command>mknbi-linux</command>'.
            </para>
            <para>
		Das Paket ltsp_initrd_kit enthält ein shell-script mit dem Namen
                <command>buildk</command>, welches alle Kommandos enthält, die man benötigt,
		um den Kernel für's Netzwerk-Booten vorzubereiten.
            </para>
        </sect2>
    </sect1>
</chapter>

<!--
<chapter>
    <title>Advanced Topic: Making bootroms</title>
    <para>
        Burning eproms with Etherboot code
    </para>
</chapter>
-->

<!--
<chapter>
    <title>Advanced Topic: Display Managers</title>
    <para>
        Burning eproms with Etherboot code
    </para>
</chapter>
-->

<!--
<chapter>
    <title>Advanced Topic: Font Server</title>
    <para>
        Burning eproms with Etherboot code
    </para>
</chapter>
-->

<!--
<chapter>
    <title>Advanced Topic: Configuring a Chooser</title>
    <para>
        Burning eproms with Etherboot code
    </para>
</chapter>
-->

<!--
<chapter>
    <title>Advanced Topic: Local Applications</title>
    <para>
        Burning eproms with Etherboot code
    </para>
</chapter>
-->

<!--
<chapter>
    <title>Advanced Topic: Accessing local peripherals</title>
    <para>
        Burning eproms with Etherboot code
    </para>
</chapter>
-->

<chapter>
    <title>lts.conf Einträge</title>
    <para>
	Als wir LTSP entwickelt haben, wussten wir, dass wir mit unterschiedlicher
	Hardware-Ausstattung bei den Clients rechen mussten. Egal welche Kombination
	aus Prozessor, Netzwerk- und Grafikkarte wir heute verwendeten, wir konnten
	fast sicher sein, dass diese Kombination in 3 Monaten, wenn wir mehr Clients
	hinzufügen wollen, nicht mehr erhältlich sein würde.

    </para>
    <para>
	Also haben wir uns einen Weg ausgedacht, wie man die Konfiguration
	aller Clients zentral speichert. Diese Konfigurationsdatei heißt
        <filename>lts.conf</filename> und sie befindet sich in
        <filename class="directory">/opt/ltsp/i386/etc</filename> .
    </para>

    <para>
	Das Format von lts.conf erlaubt Standardeinstellungen (default)
	und davon abweichende Einstellungen für einzelne Clients.
	Wenn alle ihre Clients identisch sind, dann genügt es, alle Einstellungen
	im Abschnitt [Default] einzutragen.
    </para>

    <sect1>
        <title>lts.conf Beispiel</title>
        <para>

            <screen>
[Default]
        SERVER             = 192.168.0.254
        X_MOUSE_PROTOCOL   = "PS/2"
        X_MOUSE_DEVICE     = "/dev/psaux"
        X_MOUSE_RESOLUTION = 400
        X_MOUSE_BUTTONS    = 3
        USE_XFS            = N
        RUNLEVEL           = 5

[ws001]
        XSERVER            = auto
        X_MOUSE_PROTOCOL   = "Microsoft"
        X_MOUSE_DEVICE     = "/dev/ttyS1"
        X_MOUSE_RESOLUTION = 50
        X_MOUSE_BUTTONS    = 3
        X_MOUSE_BAUD       = 1200

[ws002]
        XSERVER            = XF86_Mach64

[ws003]
        RUNLEVEL           = 3 </screen>
        </para>
    </sect1>

    <sect1>
        <title>Verfügbare Parameter in lts.conf</title>
        <sect2>
            <title>Allgemeine Parameter</title>
            <variablelist>

                <varlistentry>
                    <term><command>Kommentare</command></term>
                    <listitem>
                        <para>
				Kommentar-Zeilen beginnen mit dem '#' Zeichen
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>LTSP_BASEDIR</command></term>
                    <listitem>
                        <para>
				Damit gibt man das LTSP Wurzelverzeichnis an.
				Der Defaultwert ist
                            <filename>/opt/ltsp</filename>
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>SERVER</command></term>
                    <listitem>
                        <para>
                            Dies ist der Server, der als XDM_SERVER,
                            TELNET_HOST, XFS_SERVER und SYSLOG_HOST,
			    genommen wird, falls er nicht für einzelnen Dienste
			    extra angegeben wird.
			    Wenn Sie also einen Rechner haben, der als Server für alles
			    fungiert, dann können Sie diesen hier angeben
			    und die anderen Server-Parameter weglassen.
			    Wenn dieser Wert nicht gesetzt wird, wird der Default-Wert
			    <command>192.168.0.254</command> benutzt.
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>SYSLOG_HOST</command></term>
                    <listitem>
                        <para>
                        Wenn Sie log-Meldungen an eine andere Maschine als den
			default-Server senden wollen, dann können Sie diese
			hier angeben. Wenn dieser Wert NICHT gesetzt wird,
			dann wird der 'SERVER' Parameter genommen, wie oben beschrieben.
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>NFS_SERVER</command></term>
                    <listitem>
                        <para>
			Hier können Sie die IP-Adresse des NFS-Servers angeben
			der zum Mounten des <filename>/home</filename> Verzeichnisses
			benutzt werden soll. Wenn dieser Wert nicht gesetzt wird,
			dann wird der <command>SERVER</command> Parameter genommen.
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>USE_NFS_SWAP</command></term>
                    <listitem>
                        <para>
			Setzen Sie diese Option auf <command>Y</command>
			wenn Sie NFS-Swap verwenden wollen.
			Der Defaultwert ist <command>N</command>
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>SWAPFILE_SIZE</command></term>
                    <listitem>
                        <para>
			Hier können Sie die Größe der Swap-Datei angeben.
			Der Defaultwert ist <command>64m</command>.
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>SWAP_SERVER</command></term>
                    <listitem>
                        <para>
			Die Swap-Datei kann auf einem beliebigen NFS-Server
			liegen. Hier können Sie dessen IP-Adresse angeben.
			Der Defaultwert entspricht dem Wert, der mit
			NFS_SERVER angegeben wird.
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>NFS_SWAPDIR</command></term>
                    <listitem>
                        <para>
			Der Pfad, der vom NFS-Server für Swap-Dateien
			freigegeben wurde. Der Defaultwert ist
                            <filename>/var/opt/ltsp/swapfiles</filename>.
			Achten Sie darauf, dass dieses Verzeichnis beim
			NFS-Server in <filename>/etc/exports</filename>
			eingetragen ist.
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>TELNET_HOST</command></term>
                    <listitem>
                        <para>
			Wenn der Client als Text-Terminal genutzt wird,
			dann kann man hier angeben, zu welchem Server
			eine Telnet-Verbindung aufgebaut werden soll.
			Wenn dieser Wert nicht gesetzt ist, wird die Angabe von
   			<command>SERVER</command> genommen.
                        </para>
                        <para>
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>DNS_SERVER</command></term>
                    <listitem>
                        <para>
			Anhand dieser Angabe wird die Datei resolv.conf
			des Clients generiert.
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>SEARCH_DOMAIN</command></term>
                    <listitem>
                        <para>
			Auch dieser Wert landet in resolv.conf des Clients.
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>MODULE_01</command> bis
                          <command>MODULE_10</command></term>
                    <listitem>
                        <para>
			    Bis zu 10 Kernel-Module können durch diese
			    Einträge geladen werden.
			    Die Einträge entsprechen dem, was man hinter
			    insmod angeben würde. Beispiel:
                            <screen>
MODULE_01   = uart401.o
MODULE_02   = sb.o io=0x220 irq=5 dma=1
MODULE_03   = opl3.o </screen>
                        </para>

                        <para>
			Wenn man hier einen absoluten Pfad angibt, wird <command>insmod</command>
			benutzt um das Modul zu laden. Ansonsten wird
 			<command>modprobe</command> verwendet.
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>RAMDISK_SIZE</command></term>
                    <listitem>
                        <para>
			Wenn ein Client bootet, erzeugt er eine RAM-Disk
			und mountet sie nach /tmp. Die Größe dieser RAM-Disk
			kann man mit diesem Parameter beeinflussen.
			Angaben werden in kByte(1024Bytes)-Einheiten gemacht.
			Um eine 1MB RAM-Disk zu erzeugen, schreiben Sie
			<command>RAMDISK_SIZE = 1024</command>.

                        </para>
                        <para>
			Wenn Sie die Größe der RAM-Disk hier ändern, müssen Sie
			sie auch im Kernel verändern. Entweder fest einkompiliert oder
			beim Einsatz von Etherboot oder Netboot kann man die
			Größe angeben, wenn man den Kernel mit mknbi-linux
			'taggt'.

                        </para>
                        <para>
			Der Defaultwert ist 1024 (= 1 MB )
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>RCFILE_01</command> bis
                          <command>RCFILE_10</command></term>
                    <listitem>
                        <para>
			Das rc.local Script kann zusätzliche Startscripte
			ausführen. Legen Sie diese Scripte einfach ins
			etc/rc.d Verzeichnis und geben Sie hier den Namen
			ihres Scripts an.
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>SOUND</command></term>
                    <listitem>
                        <para>
			Wenn das LTSP Sound Paket installiert wurde,
			dann muss dieser Wert auf <command>Y</command> stehen,
			damit das Script <command>rc.sound</command> gestartet wird.
			rc.sound konfiguriert die Soundkarte und den Sound-Deamon
			(Sound-Server).
			Der Defaultwert ist <command>N</command>.
                        </para>
                    </listitem>
                </varlistentry>

            </variablelist>
        </sect2>

        <sect2>
            <title>X Window Einstellungen</title>
            <variablelist>
                <varlistentry>
                    <term><command>XDM_SERVER</command></term>
                    <listitem>
                        <para>
			Wenn die XDM Anfrage an einen anderen als den Standard-Server
			gesendet werden soll, dann kann man diesen hier angeben.
			Lässt man diese Parameter weg, dann wird der Wert von
 			'SERVER' genommen.

                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>XSERVER</command></term>
                    <listitem>
                        <para>
			Hier kann man den X Server angeben, der auf dem Client
			verwendet werden soll. Bei PCI und AGP Karten sollte
			dieser Parameter nicht nötig sein. Das rc.local Script
			ist üblicherweise in der Lage, die Grafikkarte automatisch zu
			erkennen. Um dies zu verdeutlichen, kann man den Wert auch
			auf <command>auto</command> stellen.
                        </para>

                        <para>
			Für ISA und VLB Grafikkarten oder um einen speziellen
			Treiber zu wählen, kann man hier das XFree86 4.x Treiber-Modul
			oder den Xfree86 3.3.6 X-Server angeben.
                        </para>
                        <para>
			Wenn der Wert mit <command>XF86_</command> beginnt
			wird XFree86 3.3.6 verwendet. Andernfalls wird
			XFree86 4.x.x genommen.
			Der Defaultwert ist <command>auto</command>.

                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>X_MODE_0</command> bis
                          <command>X_MODE_2</command></term>
                    <listitem>
                        <para>
			Bis zu 3 Modelines oder Bildschirm-Auflösungen
			kann man hier angeben.
			Für jeden Mode kann man entweder eine Auflösung oder eine komplette
			Modeline angeben.

                            <programlisting width=80>
X_MODE_0 = 800x600

   oder

X_MODE_0 = 800x600 60.75 800 864 928 1088 600 616 621 657 -HSync -VSync
                            </programlisting>
                        </para>
                        <para>
			Wenn keine X_MODE_x Angaben gemacht werden, dann werden
			Standard-Modelines und die Auflösungen 1024x768, 800x600
			und 640x480 verwendet.

                        </para>
                        <para>
			Wenn eine oder mehrere X_MODE_x Angaben gemacht werden, dann
			wird keine der Standard-Modelines mehr verwendet.
                        </para>

                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>X_MOUSE_PROTOCOL</command></term>
                    <listitem>
                        <para>
			Jeder Wert, der von XFree86 als Pointer Protocol
			bekannt ist, kann hier verwendet werden.
			Typische Werte sind z.B. "Microsoft" und "PS/2" oder
			"IMPS/2" für PS/2 Wheelmäuse (Intellimouse).
			Der Defaultwert ist <command>"PS/2"</command>.
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>X_MOUSE_DEVICE</command></term>
                    <listitem>
                        <para>
			Dies ist die Gerätedatei für den Maus-Anschluss.
			Bei seriellen Mäusen z.B. <command>/dev/ttyS0</command> oder
                            <command>/dev/ttyS1</command>.
			Beim PS/2 Anschluss ist es <command>/dev/psaux</command>.
			Der Defaultwert ist <command>/dev/psaux</command>.

                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>X_MOUSE_RESOLUTION</command></term>
                    <listitem>
                        <para>
			Dies ist der 'Resolution'(Auflösung)-Wert für die Maus in
 			der <command>XF86Config</command> Datei.
			Ein typischer Wert für serielle Mäuse ist <command>50</command>
			und für eine PS/2 Maus <command>400</command>.
                        Der Defaultwert ist <command>400</command>.
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>X_BUTTONS</command></term>
                    <listitem>
                        <para>
			Hier kann man die Anzahl der Mausknöpfe angeben.
			Üblicherweise <command>2</command> oder
   			<command>3</command>, bei Wheelmäusen <command>5</command>.

			Der Defaultwert ist <command>3</command>.
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>X_MOUSE_EMULATE3BTN</command></term>
                    <listitem>
                        <para>
			Durch den Wert <command>Y</command> kann man die mittlere Maustaste
			bei 2-Tasten-Mäusen simulieren, indem man beide Tasten
			gleichzeitig drückt.
                        Der Defaultwert ist <command>N</command>.
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>X_MOUSE_BAUD</command></term>
                    <listitem>
                        <para>
			Hier kann man die Baudrate für serielle Mäuse angeben
			Der Defaultwert ist <command>1200</command>.
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>X_COLOR_DEPTH</command></term>
                    <listitem>
                        <para>
			Damit kann man die Farbtiefe angeben.
			Mögliche Werte sind
                             <command>8</command> = 256 Farben,
                            <command>15</command>, <command>16</command> = 65536 Farben ,
			<command>24</command> und <command>32</command> = 4,2 Milliarden Farben .
			Nicht alle X-Server bieten alle Farbtiefen.
			Der Defaultwert ist <command>16</command>

                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>USE_XFS</command></term>
                    <listitem>
                        <para>
			Bei den Fonts (Zeichensätzen) kann man entweder einen
			Font-Server verwenden oder die Zeichensätze per NFS
			lesen.
			Der Font-Server soll die Verwaltung von Fonts an einer
			zentralen Stelle erleichtern. Allerdings gab es
			Probleme bei mehr als 40 Clients.
			Die 2 möglichen Werte lauten hier
			<command>Y</command> und <command>N</command>.
			Der Defaultwert ist <command>N</command>.

			Wenn Sie einen Fontserver verwenden wollen,
			dann können Sie mit <command>XFS_SERVER</command>
			die IP des Fontservers angeben.
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>XFS_SERVER</command></term>
                    <listitem>
                        <para>
			Wenn man einen X Fontserver benutzt, dann kann man
			hier seine IP Adresse angaben.
			Wenn diese Variable nicht gesetzt ist, wird der
			Wert von <command>SERVER</command> (s.o.) genommen.
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>X_HORZSYNC</command></term>
                    <listitem>
                        <para>
			Hier kann man den <command>HorizSync</command>
			Parameter für Xfree86 bzw. den Monitor angeben.
			Der Defaultwert ist <command>"31-62"</command>.
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>X_VERTREFRESH</command></term>
                    <listitem>
                        <para>
			Hier kann man den <command>VertRefresh</command>
			Parameter für Xfree86 bzw. den Monitor angeben.
			Der Defaultwert ist <command>"55-90"</command>.
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>XF86CONFIG_FILE</command></term>
                    <listitem>
                        <para>
			Wenn Sie eine eigenen komplette XF86Config
			Datei vorbereitet haben, dann können Sie diese
			im Verzeichnis <command>/opt/ltsp/i386/etc</command>
			ablegen. Geben Sie der Datei einen aussagekräftigen Namen,
			z.B. XF86Config.ws004.

                            <screen>
XF86CONFIG_FILE = XF86Config.ws004 </screen>
                        </para>
                    </listitem>
                </varlistentry>
            </variablelist>
        </sect2>

        <sect2>
            <title>Touch-Screen Parameter</title>
            <variablelist>
                <varlistentry>
                    <term><command>USE_TOUCH</command></term>
                    <listitem>
                        <para>
			Wenn der Client über einen Touch Screen verfügt,
			können Sie dies hier durch <command>Y</command> aktivieren.
			Der Defaultwert ist <command>N</command>.
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>X_TOUCH_DEVICE</command></term>
                    <listitem>
                        <para>
			Ein TouchScreen arbeitet ähnlich wie eine Maus
			und wird üblicherweise an einem seriellen Port
			angeschlossen. Diesen Anschluss können Sie hier angeben,
			z.B. <command>/dev/ttyS0</command>.
			Für diesen Eintrag existiert kein Defaultwert.
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>X_TOUCH_MINX</command></term>
                    <listitem>
                        <para>
                            Kalibrierungswert für einen EloTouch Touch-Screen.
                            Defaultwert: <command>433</command>.
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>X_TOUCH_MAXX</command></term>
                    <listitem>
                        <para>
			Kalibrierungswert für einen EloTouch Touch-Screen.
                            Defaultwert: <command>3588</command>.
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>X_TOUCH_MINY</command></term>
                    <listitem>
                        <para>
                            Kalibrierungswert für einen EloTouch Touch-Screen.
                            Defaultwert: <command>569</command>.
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>X_TOUCH_MAXY</command></term>
                    <listitem>
                        <para>
                            Kalibrierungswert für einen EloTouch Touch-Screen.
                            Defaultwert: <command>3526</command>.
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>X_TOUCH_UNDELAY</command></term>
                    <listitem>
                        <para>
                            Kalibrierungswert für einen EloTouch Touch-Screen.
                            Defaultwert: <command>10</command>.
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>X_TOUCH_RPTDELAY</command></term>
                    <listitem>
                        <para>
                            Kalibrierungswert für einen EloTouch Touch-Screen.
                            Defaultwert: <command>10</command>.
                        </para>
                    </listitem>
                </varlistentry>
            </variablelist>
        </sect2>

        <sect2>
            <title>Parameter für lokale Anwendungen</title>
            <variablelist>
                <varlistentry>
                    <term><command>LOCAL_APPS</command></term>
                    <listitem>
                        <para>
			Wenn Anwendungen lokal auf einem Client laufen sollen,
			stellen Sie diesen Wert auf <command>Y</command>.
			Diverse weitere Einstellungen müssen am Server vollzogen
			werden, um Client-lokale Anwendungen zu ermöglichen.
			Lesen Sie hierzu das Kapitel 'Lokale Anwendungen' im LTSP Handbuch.
			Der Defaultwert ist <command>N</command>.
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>NIS_DOMAIN</command></term>
                    <listitem>
                        <para>
			Wenn Sie (Client-)lokale Anwendungen nutzen wollen,
			benötigen Sie einen NIS-Server in ihrem Netz.
			Hier können Sie den Namen der NIS-Domain angeben.
			Der Name muss mit dem Namen, der im NIS-Server
			eingestellt ist übereinstimmen.
			Eine NIS-Domain ist nicht dasselbe wie eine Internet-
			Domain.
			Der Defaultwert ist <command>ltsp</command>.
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>NIS_SERVER</command></term>
                    <listitem>
                        <para>
			Geben Sie hier die IP-Adresse des NIS-Servers an,
			wenn der Client keinen Broadcast senden soll, um einen
			NIS-Server zufinden.
                        </para>
                    </listitem>
                </varlistentry>
            </variablelist>
        </sect2>

        <sect2>
            <title>Tastatur Einstellungen</title>
            <para>
		Alle Dateien zur (internationalen) Tastatur-Unterstützung
		sind im LTSP-Verzeichnisbaum vorhanden.
		Deshalb ist die Konfiguration der Tastatur nur noch eine
		Sache von Einträgen in der XFree86-Konfiguration.
		Hier stehen diverse Parameter zur Verfügung.
            </para>
            <para>
	        Die Namen und möglichen Werte der folgenden Parameter
		stammen aus der Dokumentation von XFree86.
		Alle für XFree86 gültigen Werte sind auch hier gültig.
            </para>
            <para>
		Wir würden in Zukunft gerne weitere Abschnitte hinzufügen
		die auflisten, welche konkreten Einstellungen für die einzelnen internationalen
		Tastaturen benötigt werden. Wenn es ihnen gelingt, ihre länderspezifische
		Tastatur einzustellen, dann informieren Sie bitte das LTSP Entwickler-Team.
            </para>
            <variablelist>
                <varlistentry>
                    <term><command>XkbTypes</command></term>
                    <listitem>
                        <para>
                            Der Defaultwert ist das Wort '<command>default</command>'.
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>XkbCompat</command></term>
                    <listitem>
                        <para>
				Der Defaultwert ist das Wort '<command>default</command>'.
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>XkbSymbols</command></term>
                    <listitem>
                        <para>
				Der Defaultwert ist
                            '<command>us(pc101)</command>'.
				Dieser Defaultwert ist auch für deutsche Tastaturen o.k.
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>XkbModel</command></term>
                    <listitem>
                        <para>
				Der Defaultwert ist '<command>pc101</command>'.
				Dieser Defaultwert ist auch für deutsche Tastaturen o.k.
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>XkbLayout</command></term>
                    <listitem>
                        <para>
                            Der Defaultwert ist '<command>us</command>'.
			    Der Wert für eine deutsche Tastatur lautet '<command>de</command>'.
                        </para>
                    </listitem>
                </varlistentry>
            </variablelist>
        </sect2>

        <sect2>
            <title>Drucker Konfiguration</title>
            <para>
	    	Maximal 3 Drucker können an einem Client angeschlossen werden.
		Eine Kombination aus seriellen und parallelen Druckern kann mit
		den folgenden Einträgen in <command>lts.conf</command> konfiguriert werden.
            </para>

            <variablelist>
                <varlistentry>
                    <term><command>PRINTER_0_DEVICE</command></term>
                    <listitem>
                        <para>
                            Das Device (Anschluss) des ersten Druckers.
			    Beispiele:
                            <command>/dev/lp0</command>
                            <command>/dev/ttyS0</command>
                            <command>/dev/ttyS1</command>
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>PRINTER_0_TYPE</command></term>
                    <listitem>
                        <para>
			Der Druckertyp.
                           Gültige Werte sind
                            '<command>P</command>' für Parallel-Port Drucker,
                            und '<command>S</command>' für Serielle Drucker.
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>PRINTER_0_PORT</command></term>
                    <listitem>
                        <para>
                            Die TCP/IP Port-Nummer für den Druck-Server-Prozess
			    auf dem Client (HP JetDirect Protokoll).
			    Defaultwert ist '<command>9100</command>'
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>PRINTER_0_SPEED</command></term>
                    <listitem>
                        <para>
			Für serielle Drucker kann man hier die Baudrate einstellen.
			Defaultwert ist '<command>9600</command>' .
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>PRINTER_0_FLOWCTRL</command></term>
                    <listitem>
                        <para>
			Für serielle Drucker kann man hier die Art der
			Flusskontrolle angeben. Entweder
                             '<command>S</command>' für Software (XON/XOFF)
			     Flusskontrolle , oder
                            '<command>H</command>' für Hardware (CTS/RTS)
                            Flusskontrolle.  Wenn nichts angegeben wird,
                            gilt '<command>S</command>' als Defaultwert.
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>PRINTER_0_PARITY</command></term>
                    <listitem>
                        <para>
			Für serielle Drucker kann man hier die Parität
			angeben. Zur Auswahl stehen:
                           '<command>E</command>'-Even(Gerade)
   			   '<command>O</command>'-Odd(Ungerade)
                           '<command>N</command>'-None(keine Parität)
			      Wenn nichts angegeben wird,
                         gilt  '<command>N</command>' als Defaultwert.
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>PRINTER_0_DATABITS</command></term>
                    <listitem>
                        <para>
			Für serielle Drucker kann man hier die
  			Anzahl der Datenbits angeben. Zur Auswahl stehen:
                            '<command>5</command>', '<command>6</command>',
                            '<command>7</command>' und '<command>8</command>'.
                           Wenn nichts angegeben wird,
                         gilt  '<command>8</command>' als Defaultwert.
                        </para>
                    </listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>PRINTER_1_DEVICE</command></term>
                    <listitem><para>Device (Anschluss) des zweiten Druckers</para></listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>PRINTER_1_TYPE</command></term>
                    <listitem><para>Typ des zweiten Druckers</para></listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>PRINTER_1_PORT</command></term>
                    <listitem><para>TCP/IP-Port des zweiten Druckers</para></listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>PRINTER_1_SPEED</command></term>
                    <listitem><para>Baudrate des zweiten Druckers (seriell)
                          </para></listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>PRINTER_1_FLOWCTRL</command></term>
                    <listitem><para>Flusskontrolle des zweiten Druckers(seriell)
                           </para></listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>PRINTER_1_PARITY</command></term>
                    <listitem><para>Parität des zweiten Druckers(seriell)
                             </para></listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>PRINTER_1_DATABITS</command></term>
                    <listitem><para>Anzahl Datenbits des zweiten Druckers(seriell)
                              </para></listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>PRINTER_2_DEVICE</command></term>
                    <listitem><para>Device-Name des dritten Druckers
                              </para></listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>PRINTER_2_TYPE</command></term>
                    <listitem><para>Typ des dritten Druckers
                              </para></listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>PRINTER_2_PORT</command></term>
                    <listitem><para>TCP/IP-Port des dritten Druckers
                              </para></listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>PRINTER_2_SPEED</command></term>
                    <listitem><para>Baudrate des dritten Druckers (seriell)
		    </para></listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>PRINTER_2_FLOWCTRL</command></term>
                    <listitem><para>Flusskontrolle des dritten Druckers (seriell)
		    </para></listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>PRINTER_2_PARITY</command></term>
                    <listitem><para>Parität des dritten Druckers (seriell)
		    </para></listitem>
                </varlistentry>

                <varlistentry>
                    <term><command>PRINTER_2_DATABITS</command></term>
                    <listitem><para>Anzahl Datenbits des dritten Druckers (seriell)
		    </para></listitem>
                </varlistentry>
            </variablelist>
        </sect2>
    </sect1>
</chapter>

<chapter>
    <title>Lokale Anwendungen</title>
    <para>
    In einer LTSP-Umgebung hat man die Wahl, ob die Programme lokal auf dem Client
    oder remote auf dem Server laufen sollen.
    </para>

    <para>
    	Die Anwendungen auf dem Server laufen zu lassen ist die einfachere
	Variante. Dabei läuft die Anwendung auf dem Prozessor und im Arbeitsspeicher des
	Servers, die Interaktion mit dem Benutzer, also Bildschirmausgabe und
	Tastatur- und Mauseingabe, erfolgt beim Client.
    </para>

    <para>
	Dies ist eine eingebaute Fähigkeit des X Window Systems.
	Der Client funktioniert wie ein X Window Terminal.

    </para>

    <para>
	Wenn eine Anwendung auf dem Client laufen soll, dann benötigt der Client-PC
	einige Informationen über den Benutzer:
        <itemizedlist>
            <listitem>
                <para>
                    Benutzer ID (UID)
                </para>
            </listitem>
            <listitem>
                <para>
                    Primäre Benutzergruppe (GID)
                </para>
            </listitem>
            <listitem>
                <para>
                    Das Heimatverzeichenis des Benutzers
                </para>
            </listitem>
        </itemizedlist>
	LTSP benutzt Network Information Service - NIS (früher auch
 	<emphasis role="strong">Yellow Pages</emphasis> genannt),
	um den Clients diese Informationen zur Verfügung zu stellen.

    </para>

    <sect1>
        <title>Vorteile von lokalen Anwendungen</title>
        <para>

        </para>
        <para>
            <itemizedlist>
                <listitem>
                    <para>
			Reduzierte Server-Last. In großen Netzen mit
			speicherintensiven Anwendungen, wie z.B. Netscape,
			kann es die Performance verbessern, solange der
			Client über genung CPU-Leistung und RAM verfügt
			um die Anwendung(en) zu bewältigen.

                    </para>
                </listitem>
                <listitem>
                    <para>
		    Sog. "runaway" Prozesse, also Prozesse, die aufgrund von
		    Fehlern viel CPU-Leistung und RAM an sich reißen,
		    wirken sich nicht störend auf andere Benutzer aus.
                    </para>
                </listitem>
                <listitem>
                    <para>
		    Soundunterstützung ist viel einfacher zu konfigurieren,
		    wenn die Anwendung, die den Sound erzeugt, lokal auf dem
		    Client läuft.
                    </para>
                </listitem>
            </itemizedlist>
        </para>
    </sect1>

    <sect1>
        <title>Dinge, die man beim Einsatz von lokalen Anwendungen beachten sollte</title>
        <para>
            Lokale Anwendungen erfordern deutlich mehr Konfigurationsaufwand.
            <itemizedlist>
                <listitem>
                    <para>
		Lokale Anwendungen erfordern mehr Leistung von der Client Hardware.
		Man benötigt mehr RAM und eine schnellere CPU. Empfehlung: 64MB RAM
		oder mehr.
                    </para>
                </listitem>
                <listitem>
                    <para>
		    NIS - um Anwendungen auf dem Client laufen zu lassen, muss man
		    sich zuerst gegenüber dem Client identifizieren.
		    Der Client muss wissen, wer Sie sind. Dazu wird eine Art von
		    Passwort-Authentifizierung benötigt. Wir haben NIS gewählt um
		    Authentifizierung übers Netzwerk zu ermöglichen.

                    </para>
                </listitem>
                <listitem>
                    <para>
		    Für lokale Anwendungen müssen zusätzliche Verzeichnisse
		    vom Server per NFS exportiert werden.
                    </para>
                </listitem>
                <listitem>
                    <para>
		    Anwendungen starten langsamer, denn sie müssen via NFS
		    gelesen werden, was außerdem auch mehr Netzwerk-Traffic
		    verursacht.
			Weil jede Kopie eines Programms auf seiner eigenen CPU
			läuft, verzichtet man auf den Vorteil von gemeinsamen
			(shared) Code-Segmenten im RAM. Gemeinsame Code-Segmente
			sorgen dafür, dass weitere Instanzen eines Programms
			deutlich schneller starten.
                    </para>
                </listitem>
            </itemizedlist>
        </para>
    </sect1>

    <sect1>
        <title>Server Konfiguration für lokale Anwendungen</title>
        <sect2>
            <title>Einträge in lts.conf</title>
            <para>
                In der <filename>lts.conf</filename> Datei
		müssen einige Einträge gemacht werden:
                <variablelist>
                  <varlistentry>
                    <term><command>LOCAL_APPS</command></term>
                    <listitem>
                      <para>
		      Dieser Wert muss auf <command>Y</command> stehen.
		      Dadurch werden folgende Vorgänge beim Booten des Clients
		      ausgelöst:
                        <orderedlist>
                          <listitem>
                            <para>
			    Das <filename>/home</filename>
                            Verzeichnis des Servers wird per NFS gemountet.
                            </para>
                          </listitem>
                          <listitem>
                            <para>
                              Die Datei <filename>/var/yp/nicknames</filename>
                              wird auf dem Client angelegt.
                            </para>
                          </listitem>
                          <listitem>
                            <para>
                              Der <command>portmapper</command>
                              wird auf dem Client gestartet.
                            </para>
                          </listitem>
                          <listitem>
                            <para>
                              <command>xinetd</command>
				wird auf dem Client gestartet.
                            </para>
                          </listitem>
                          <listitem>
                            <para>
                              Die Datei <filename>/etc/yp.conf</filename>
                              wird auf dem Client erzeugt.
                            </para>
                          </listitem>
                          <listitem>
                            <para>
                              Das  <command>domainname</command>
                              Kommando wird mit dem Wert von <command>NIS_DOMAIN</command>
                              aus lts.conf ausgeführt.
                            </para>
                          </listitem>
                          <listitem>
                            <para>
                              Das <command>ypbind</command>
                              wird ausgeführt.
                            </para>
                          </listitem>
                        </orderedlist>
                      </para>
                    </listitem>
                  </varlistentry>
                  <varlistentry>
                    <term><command>NIS_DOMAIN</command></term>
                    <listitem>
                      <para>
			NIS-Server und alle zugehörigen NIS-Clients müssen zu derselben
			NIS-Domain gehören. (NIS-Domains haben nichts mit DNS/Internet
			Domains zu tun)
                      </para>
                    </listitem>
                  </varlistentry>
                  <varlistentry>
                    <term><command>NIS_SERVER</command></term>
                    <listitem>
                      <para>
		      Ein NIS-Client versucht entweder eine Verbindung mit einem
		      bestimmten NIS-Server herzustellen, oder er sendet ein
		      Broadcast ins Netz und wartet, dass sich ein Server meldet.
			Wenn Sie einen NIS-Server angeben wollen , dann tragen Sie
			seine IP-Adresse hier ein.
                      </para>
                    </listitem>
                  </varlistentry>
                </variablelist>
            </para>
        </sect2>

        <sect2>
            <title>Network Information Service - NIS</title>
            <para>
	    NIS ist ein Client/Server Dienst. Auf dem Server läuft ein
	    daemon (Hintergrundprozess/Dienst), welcher Anfragen von den
	    Clients entgegen nimmt.
	    Dieser Prozess heißt <command>ypserv</command>.
            </para>
            <para>
	    Auf dem Client gibt es den Prozess <command>ypbind</command>.
		Wenn der Client Informationen über den User benötigt,
		z.B. zur Passwort-Überprüfung, oder den Namen
		des Heimatverzeichnisses, dann wird ypbind benutzt,
		um eine Verbindung mit ypserv auf dem Server herzustellen.
            </para>
            <para>
	    Wenn Sie bereits NIS in ihrem Netzwerk verwenden, ist es nicht nötig
	    den LTSP-Server als zusätzlichen NIS-Server zu betreiben.
		Tragen Sie einfach in lts.conf für NIS_DOMAINNAME und NIS_SERVER
		Werte ein, die zu ihrem Netz passen.
            </para>
            <para>
	    Wenn Sie in ihrem Netz bisher noch kein NIS verwenden, müssen Sie
		<command>ypserv</command> auf dem Server konfigurieren & starten.

            </para>
            <para>
	    Umfassende Infornationen über die Installation eines NIS-Servers
	    finden Sie im <emphasis role="strong">The Linux NIS(YP)/NYS/NIS+ HOWTO</emphasis>
	    des LDP (Linux Documentation Project).
	    Siehe "Weitere Informationsquellen" am Ende dieses Handbuchs.
            </para>
        </sect2>
    </sect1>

    <sect1>
        <title>Konfiguration von Anwendungen</title>
        <para>
	Damit eine Anwendung auf dem Client laufen kann, müssen Sie alle
	Teile der Anwendung dahin kopieren, wo der Client Sie auch finden kann.
        </para>

        <para>
	Bei älteren LTSP Versionen (2.08 und früher) wurden viele Verzeichnisse
	des Servers per NFS exportiert und vom Client gemountet.
	Verzeichnisse wie z.B. <filename>/bin</filename>,
            <filename>/usr/bin</filename>, <filename>/lib</filename> und
            <filename>/usr</filename> wurden exportiert.
        </para>

        <para>
	Das Problem bei dieser Vorgehensweise ist, dass es nur funktioniert,
	wenn Client und Server die gleiche Hardware-Architektur verwenden.
	Sogar der Unterschied zwischen einem Server mit Pentium II (i686)
	und einem Client mit Pentium I (i586) kann zu einem Problem werden,
	da der Server wahrscheinlich i686 Libraries (Programm-Bibliotheken)
	 hat und keine i386, i486 oder i586 libraries.
        </para>

        <para>
	Also ist der sauberste Weg, einen kompletten Verzeichnisbaum zu haben,
	der alle Programme und Libraries enthält, den der Client benötigt,
	unabhängig von den Programme und Libraries des Servers.
        </para>

        <para>
	Alle Teile , die eine (Client-lokale) Anwendung benötigt, müssen
	in diesem Verzeichnisbaum abgelegt werden.
	Eines der LTSP-Pakete, die auf der LTSP-Website zum Download zu
	Verfügung stehen, ist das Paket local_netscape. Es installiert
	viele Dateien ins <filename>/opt/ltsp/i386/usr/local/netscape</filename>
	Verzeichnis. Darin enthalten sind Java-Klassen, Hilfe-Texte,
	Programmdateien und Scripte.
        </para>

        <para>
	Netscape benötigt keine zusätzlichen System-Libraries, deswegen
	muss in <filename>/opt/ltsp/i386/lib</filename> nichts hinzugefügt
	werden. Viele andere Anwendungen benötigen jedoch zusätzliche Libraries.
        </para>

        <para>
	Also, wie finden wir heraus, welche Libraries benötigt werden ?
        Dazu lässt sich das <command>ldd</command> Kommando gut verwenden.
        </para>
        <para>
	Nehmen wir an, Sie wollen eine bestimmte Anwendung als Client-lokale
	Anwendung einrichten. Als Beispiel nehmen wir das Programm <command>gaim</command>.
	<command>gaim</command> ist ein AOL Instant Messenger Client,
	er ermöglicht die Kommunikation mit anderen AIM Benutzern im Internet.
        </para>
        <para>
	Als erstes müssen Sie die <command>gaim</command> Binärdatei finden.
	Bei RedHat 7.2 liegt sie im <filename>/usr/bin</filename> Verzeichnis.
	Die Tools <command>type</command> und <command>which</command> sind
	für eine solche Suche hilfreich.
        </para>
        <para>
	Wenn Sie die <command>gaim</command>Binärdatei gefunden haben,
	können Sie mit <command>ldd</command> die benötigten Libraries
	herausfinden.
            <programlisting>
[jam@server /]$ ldd /usr/bin/gaim
        libaudiofile.so.0    => /usr/lib/libaudiofile.so.0 (0x40033000)
        libm.so.6            => /lib/i686/libm.so.6 (0x40051000)
        libnsl.so.1          => /lib/libnsl.so.1 (0x40074000)
        libgnomeui.so.32     => /usr/lib/libgnomeui.so.32 (0x4008a000)
        libart_lgpl.so.2     => /usr/lib/libart_lgpl.so.2 (0x4015d000)
        libgdk_imlib.so.1    => /usr/lib/libgdk_imlib.so.1 (0x4016c000)
        libSM.so.6           => /usr/X11R6/lib/libSM.so.6 (0x40191000)
        libICE.so.6          => /usr/X11R6/lib/libICE.so.6 (0x4019a000)
        libgtk-1.2.so.0      => /usr/lib/libgtk-1.2.so.0 (0x401b1000)
        libdl.so.2           => /lib/libdl.so.2 (0x402df000)
        libgdk-1.2.so.0      => /usr/lib/libgdk-1.2.so.0 (0x402e3000)
        libgmodule-1.2.so.0  => /usr/lib/libgmodule-1.2.so.0 (0x40319000)
        libXi.so.6           => /usr/X11R6/lib/libXi.so.6 (0x4031d000)
        libXext.so.6         => /usr/X11R6/lib/libXext.so.6 (0x40325000)
        libX11.so.6          => /usr/X11R6/lib/libX11.so.6 (0x40333000)
        libgnome.so.32       => /usr/lib/libgnome.so.32 (0x40411000)
        libgnomesupport.so.0 => /usr/lib/libgnomesupport.so.0 (0x40429000)
        libesd.so.0          => /usr/lib/libesd.so.0 (0x4042e000)
        libdb.so.2           => /usr/lib/libdb.so.2 (0x40436000)
        libglib-1.2.so.0     => /usr/lib/libglib-1.2.so.0 (0x40444000)
        libcrypt.so.1        => /lib/libcrypt.so.1 (0x40468000)
        libc.so.6            => /lib/i686/libc.so.6 (0x40495000)
        libz.so.1            => /usr/lib/libz.so.1 (0x405d1000)
        /lib/ld-linux.so.2   => /lib/ld-linux.so.2 (0x40000000) </programlisting>
        </para>
        <para>
	Das obere Listing zeigt alle dynamisch gelinkten Libraries, die
	von <command>gaim</command> benötigt werden.
        </para>
        <para>
	Die meisten Programme, die shared Libraries verwenden, benötigen
	den dynamischen Loader <command>ld-linux</command> um jede der
	Libraries zu finden und zu laden.
	Manche Programme laden die Libraries jedoch manuell mit dem
	<command>dlopen()</command> Systemaufruf. Bei solchen Anwendungen
	wird <command>ldd</command> die benötigten Libraries nicht anzeigen.
	Für solche Fälle kann man das <command>strace</command> Kommando verwenden.
	strace wird alle <command>dlopen()</command> Aufrufe mit den zugehörigen
	Libraries anzeigen.
        </para>
        <para>
	Hat man die Liste der benötigten Libraries ermittelt, müssen diese
	an die richtigen Stellen in den <filename>/opt/ltsp/i386</filename>
	Baum kopiert werden.
        </para>

    </sect1>

    <sect1>
        <title>Lokale Anwendungen starten</title>
        <para>
	X Window Programme starten üblicherweise dort, wo der Fenstermanager läuft.
	Wenn der Fenstermanager auf dem Server läuft und seine Ausgaben auf den Client
	schickt, dann wird jede gestartete Anwendung ebenfalls auf dem Server laufen
	und die Ausgaben zum Client schicken.
        </para>
        <para>
	Der Trick bei lokalen Anwendungen besteht darin, dass der Server dem Client
	sagt, ein Programm zu starten. Dies wird üblicherweise mit dem <command>rsh</command>
	Kommando gemacht.
        </para>
        <para>
	Hier ein Beispiel wie man <command>gaim</command> auf dem Client startet:
            <programlisting>
HOST=`echo $DISPLAY | awk -F: '{ print $1 }'`
rsh ${HOST} /usr/bin/gaim -display ${DISPLAY} </programlisting>
        </para>
        <para>
	Das obige Beispiel kann man in einem  <command>xterm</command> Fenster
	eingeben, oder in ein Shell-Script schreiben, welches dann durch den Klick
	auf ein Icon ausgelöst werden kann.
        </para>
        <para>
	Der lokale Start von Netscape läuft ähnlich ab, allerdings muss
	vor dem Start eine Umgebungs-Variable gesetzt werden.
            <programlisting>
HOST=`echo $DISPLAY | awk -F: '{ print $1 }'`
rsh ${HOST} MOZILLA_HOME=/usr/local/netscape \
       /usr/local/netscape/netscape -display ${DISPLAY} </programlisting>
        </para>
    </sect1>

</chapter>

<chapter>
    <title>Konfigurations-Beispiele</title>
    <para>
	Fast alle Eigenschaften des Clients können durch einen Eintrag
	in der Datei <filename>lts.conf</filename> festgelegt werden.
	Diese Datei liegt gewöhnlich im Verzeichnis 
	<filename>/opt/ltsp/i386/etc</filename>.
    </para>
    <sect1>
        <title>Serielle Maus</title>
        <para>
            Beispieleintrag in <filename>lts.conf</filename> für
            eine serielle Standard-Maus mit 2 Tasten:
            <screen>
X_MOUSE_PROTOCOL    = "Microsoft"
X_MOUSE_DEVICE      = "/dev/ttyS0"
X_MOUSE_RESOLUTION  = 400
X_MOUSE_BUTTONS     = 2
X_MOUSE_EMULATE3BTN = Y
</screen>
        </para>
    </sect1>

    <sect1>
        <title>PS/2 Wheel-Maus</title>
        <para>
            Beispieleintrag in <filename>lts.conf</filename> für
    	    eine Intellimouse (auch für Logitech M-BA47 o.ä.):
            <screen>
X_MOUSE_PROTOCOL    = "IMPS/2"
X_MOUSE_DEVICE      = "/dev/psaux"
X_MOUSE_RESOLUTION  = 400
X_MOUSE_BUTTONS     = 5
X_ZAxisMapping      = "4 5"
</screen>
        </para>
    </sect1>

    <sect1>
        <title>USB Drucker an ThinkNic</title>
        <para>
            Der ThinkNIC-Client hat einen USB-Anschluss, der für einen Drucker
	    benutzt werden kann.  Beispieleintragungen für solch einen Drucker
	    in <filename>lts.conf</filename>:
            <screen>
MODULE_01           = usb-ohci
MODULE_02           = printer
PRINTER_0_DEVICE    = /dev/usb/lp0
PRINTER_0_TYPE      = S
</screen>
        </para>
    </sect1>

    <sect1>
        <title>Einen passenden Xserver von XFree86 3.3.6 konfigurieren </title>
        <para>
            Per Voreinstellung wird XFree86 4.1.0 für den Client eingerichtet.
            Für ältere Graphikkarten, die von der Version 4.1.0 nicht mehr unterstützt
	    werden, muss zunächst das richtige Xserver-Paket der Version 3.3.6
	    heruntergeladen und installiert werden. 
            Dann muss man noch die richtigen Einträge in der Datei
            <filename>lts.conf</filename> vornehmen.
            Beispieleinträge für den Start des <command>SVGA</command>-
            Xservers (dieser unterstützt sehr viele alte Karten):
            <screen>
XSERVER             = XF86_SVGA
</screen>
        </para>
    </sect1>


</chapter>

<chapter>
    <title>Weitere Informationsquellen</title>
    <sect1>
        <title>Im Internet</title>
        <para>
            <orderedlist>
                <listitem>
                    <para>
                        Die LTSP Home-Page&nbsp;&nbsp;
                    </para>
                    <para>
                        <ulink url="http://www.LTSP.org">
                            <citetitle>www.LTSP.org</citetitle>
                        </ulink>
                    </para>
                    <para>
                    </para>
                </listitem>

                <listitem>
                    <para>
                        Diskless-Nodes HOW-TO für Linux&nbsp;&nbsp;
                    </para>
                    <para>
                        <ulink url="http://www.linuxdoc.org/HOWTO/Diskless-HOWTO.html">
                            <citetitle>www.linuxdoc.org/HOWTO/Diskless-HOWTO.html</citetitle>
                        </ulink>
                    </para>
                    <para>
                    </para>
                </listitem>

                <listitem>
                    <para>
                        Etherboot Home-Page&nbsp;&nbsp;
                    </para>
                    <para>
                        <ulink url="http://etherboot.sourceforge.net">
                            <citetitle>etherboot.sourceforge.net</citetitle>
                        </ulink>
                    </para>
                    <para>
                    </para>
                </listitem>

                <listitem>
                    <para>
                        The Rom-O-Matic Site&nbsp;&nbsp;
                    </para>
                    <para>
                        <ulink url="http://www.rom-o-matic.net">
                            <citetitle>www.Rom-O-Matic.net</citetitle>
                        </ulink>
                    </para>
                    <para>
                    </para>
                </listitem>

                <listitem>
                    <para>
                        XFree86 Maus-Unterstützung&nbsp;&nbsp;
                    </para>
                    <para>
                        <ulink url="http://www.xfree86.org/current/mouse.html">
                            <citetitle>www.xfree86.org/current/mouse.html</citetitle>
                        </ulink>
                    </para>
                    <para>
                    </para>
                </listitem>


                <listitem>
                    <para>
                        XFree86-Video-Timings-HOWTO&nbsp;&nbsp;
                    </para>
                    <para>
                        <ulink url="http://www.linuxdoc.org/HOWTO/XFree86-Video-Timings-HOWTO.html">
                            <citetitle>www.linuxdoc.org/HOWTO/XFree86-Video-Timings-HOWTO.html</citetitle>
                        </ulink>
                    </para>
                    <para>
                    </para>
                </listitem>

                <listitem>
                    <para>
                        Das Linux NIS(YP)/NYS/NIS+ HOWTO&nbsp;&nbsp;
                    </para>
                    <para>
                        <ulink url="http://www.linuxdoc.org/HOWTO/NIS-HOWTO.html">
                            <citetitle>www.linuxdoc.org/HOWTO/NIS-HOWTO.html</citetitle>
                        </ulink>
                    </para>
                    <para>
                    </para>
                </listitem>


            </orderedlist>
        </para>
    </sect1>

    <sect1>
        <title>Gedruckte Publikationen</title>
        <para>
            <orderedlist>
                <listitem>
                    <para>
                        <literalLayout>
Managing NFS and NIS
Hal Stern
O'Reilly &amp; Associates, Inc.
1991
ISBN 0-937175-75-7
                        </literalLayout>
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <literalLayout>
TCP/IP Illustrated, Volume 1
W. Richard Stevens
Addison-Wesley
1994
ISBN 0-201-63346-9
                        </literalLayout>
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <literalLayout>
X Window System Administrator's Guide
Linda Mui and Eric Pearce
O'Reilly &amp; Associates, Inc.
1993
ISBN 0-937175-83-8
(Volume 8  of the The Definitive Guides to the X Window System)
                        </literalLayout>
                    </para>
                </listitem>
            </orderedlist>
        </para>
    </sect1>
</chapter>

</book>