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

<!-- TOCTITLE="Inhaltsverzeichnis" -->

<book id="ltsp-4.1.3-2-de" lang="de">

  <bookinfo>
    <title>LTSP - Linux Terminal Server Project - v4.1</title>

    <authorgroup>
        <author>
           <firstname>James</firstname>
           <surname>McQuillan</surname>
           <affiliation>
              <address><email>jam@LTSP.org</email>
              </address>
           </affiliation>
        </author>
        <othercredit>
	   <firstname>Martin</firstname>
           <surname>Newiger</surname>
	   <affiliation>
		<address><email>mn@mn-ix.de</email></address>
	   </affiliation>
	</othercredit>
	<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>4.1.3-en&nbsp;</revnumber>
	 <date>2004-06-20</date>
	 <authorinitials>jam</authorinitials>
       </revision>
       <revision>
	 <revnumber>4.1.3-0-de&nbsp;</revnumber>  
         <date>2005-11-05</date>
         <authorinitials>mn</authorinitials>
       </revision>
       <revision>
	 <revnumber>4.1.3-1-de&nbsp;</revnumber>  
         <date>2005-11-06</date>
         <authorinitials>ws</authorinitials>
       </revision>
       <revision>
         <revnumber>4.1.3-2-de&nbsp;</revnumber>
	 <date>2005-11-22</date>
	 <authorinitials>mn</authorinitials>
       </revision>
    </revhistory>

    <copyright>
        <year>2004</year>
        <holder>James A. McQuillan</holder>
    </copyright>
    <copyright>
    	<year>2005</year>
	<holder>Martin Newiger, 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. Allerdings werden 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 graphische oder textbasierte Terminals 
	 eines GNU/Linux-Servers zu benutzen.
    </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 (wenn überhaupt) 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. Die Festplatte, das
        Disketten- und CDROM-Laufwerk können entfernt werden. Lediglich eine 
        Netzwerkkarte, von der der Rechner gebootet werden kann, muss eingebaut
        werden. Viele Netzwerkkarten besitzen einen Bootrom-Sockel, der geradezu
        darauf wartet, dass ein Bootrom eingesetzt wird.
    </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>
        Die Workstation kann auf drei Weisen konfiguriert werden:
        <itemizedlist>
       	    <listitem>
	     	 <para><command>Graphische Oberfläche - X Window System</command></para>
		 <para>
		     Unter dem X Window System kann die Workstation alle 
		     Anwendungsprogramme auf dem Server oder auf anderen Servern 
		     im Netzwerk benutzen.
		 </para>
	    </listitem>
        </itemizedlist>
       
        <itemizedlist>
            <listitem>
	         <para><command>Textbasierte Telnet-Sitzungen</command></para>
		 <para>
		     Die Workstation kann bis zu neun 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>Shell-Eingabeaufforderung</command></para>
		 <para>
		     Die Workstation kann so konfiguriert werden, dass man 
		     direkt in eine bash-Shell auf der Konsole eingeloggt wird. 
		     Dies ist beim Debuggen von X-Window- oder NFS-Problemen 
		     sehr nützlich.
		 </para>
            </listitem>
        </itemizedlist>
     </para>

    <para>
        Das Tolle an der Sache ist, dass eine Menge von Workstations von einem
	einzigen GNU/Linux-Server bedient werden kann. Wie viele Workstations
	können es denn sein? Nun, das hängt von der Leistungsfähigkeit des 
	Servers und den Anwendungen ab, die benutzt werden sollen.
    </para>
    
    <para>
        Es ist durchaus nicht ungewöhnlich, 50 Workstations mit Mozilla und
	OpenOffice über einen Dual P4-2.4 (Xeon) mit 4GB RAM zu betreiben. Wir 
	wissen, dass es geht. In der Tat ist der load-average-Wert selten über 
	1.0!
    </para>
    
    <sect1>
    	<title>Disclaimer</title>
	<para>
	    Weder der Autor noch die Übersetzer, Distributoren oder jeder 
	    andere, der etwas in irgendeiner Form zu diesem Dokument beiträgt,
	    sind in irgendeiner Weise verantwortlich zu machen für physikalische, 
	    finanzielle, moralische oder irgendwelche anderen Schäden, welche
	    infolge der Vorschläge in diesem Text eintreten.
	</para>
    </sect1>
</preface>

<chapter>
    <title>Die Theorie</title>
    <para>
        Das Booten einer plattenlosen Workstation umfasst mehrere Schritte. 
	Versteht man diese, ist es viel einfacher, auftretende Probleme zu
	lösen.
    </para>
    
    <para>
        Es werden vier grundlegende Dienste benötigt, um eine LTSP-Workstation
	zu booten. Diese sind:
	<itemizedlist>
	    <listitem>
	        <para>DHCP</para>
	    </listitem>
	    <listitem>
	    	<para>TFTP</para>
	    </listitem>
	    <listitem>
	    	<para>NFS</para>
	    </listitem>
	    <listitem>
	    	<para>XDMCP</para>
	    </listitem>
	 </itemizedlist>
    </para>
    
    <para>
        LTSP ist extrem flexibel. Jeder der oben genannten Dienste kann von 
	einem einzigen Server oder von mehreren verschiendenen Servern zur Verfügung gestellt
	werden. In unserem Beispiel werden wir das einfache Setup beschreiben, welches aus
	einem einzigen Server besteht, der die Dienste bereitstellt.
    </para>
    
<sect1>
  <title>Der Konfigurationsablauf auf der Workstation</title>
    
    <orderedlist spacing="normal">
    <listitem>
    	<para>
	    Laden des Linux-Kernels in den Arbeitsspeicher der Workstation: Dies
	    kann auf eine der folgenden Weisen passieren:
	    <orderedlist>
	      <listitem>
	      	<para>
		  Bootrom (Etherboot, PXE, MBA, Netboot)
		</para>
	      </listitem>
	      <listitem>
	      	<para>
		  Floppy
		</para>
	      </listitem>
	      <listitem>
	      	<para>
		  Festplatte
		</para>
	      </listitem>
	      <listitem>
	      	<para>
		  CD-ROM
		</para>
	      </listitem>
	      <listitem>
	      	<para>
		  USB-Speichergerät
		</para>
	      </listitem>
	    </orderedlist>
	</para>
	<para>
	  Jede der oben genannten Bootmethoden wird später in diesem Kapitel
	  erklärt.
	</para>
	<para></para>
    </listitem>
    
    <listitem>
    	<para>
	    Sobald der Kernel in den Speicher geladen ist, wird er ausgeführt.
	</para>
	<para></para>
    </listitem>
    
    <listitem>
    	<para>
	    Der Kernel initialisiert das gesamte System und alle 
	    Peripheriegeräte, die von ihm erkannt werden.
	</para>
	<para></para>
    </listitem>
    
    <listitem>
    	<para>
	    Jetzt wird es richtig spannend. Während des Kernel-Ladeprozesses 
	    wird auch ein RAM-Disk-Image in den Speicher geladen; angehängt ist
	    nämlich ein Image eines Dateisystems. Ein Kommandozeilen-Parameter
	    in der Form <command>root=/dev/ram0</command> teilt dem Kernel mit,
	    dass er dieses Image als Root-Dateisystem mounten soll.
	</para>
	<para></para>
    </listitem>
    
    <listitem>
    	<para>
	    Normalerweise führt der Kernel nach dem Booten das 
	    <command>init</command>-Programm aus. In diesem Fall jedoch weisen
	    wir den Kernel an, stattdessen ein Shell-Skript zu laden. Dies
	    geschieht durch den Parameter <command>init=/linuxrc/</command> in 
	    der Kommandozeile des Kernels.
	</para>
	<para></para>
    </listitem>
    
    <listitem>
    	<para>
	     Das <command>/linuxrc/</command>-Skript sucht zu Beginn durch
	     Scannen des PCI-Busses 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 Netzwerkkarten-Treibermodul zurückgegeben und dieses
	     wird abschließend auch 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>
	    Nun wird ein kleiner DHCP-Client namens 
	    <command>dhclient</command> aufgerufen, um eine erneute Anfrage an
	    den DHCP-Server zu senden. Wir führen diese Anfrage im User-Space 
	    durch, weil wir noch mehr Informationen benötigen als die, die das 
	    Bootrom nach der ersten DHCP-Anfrage erhalten hat.
	</para>
	<para></para>
    </listitem>
    
    <listitem>
    	<para>
	    Erhält das Programm <command>dhclient</command> eine Antwort vom 
	    Server, ruft es die Datei <command>/etc/dhclient-script/</command>
	    auf, das die erhaltenen Informationen nutzt und somit das
	    Netzwerkinterface eth0 konfiguriert.
	</para>
	<para></para>
    </listitem>
    
    <listitem>
    	<para>
	    Bis zu diesem Zeitpunkt lag das root-Dateisystem auf einer RAM-Disk
	    vor. Jetzt wird das /linuxrc-Skript ein neues root-Dateisystem via
	    NFS mounten. Typischerweise wird das Verzeichnis 
	    <command>/opt/ltsp/i386/</command> vom Server exportiert. Das
	    /linuxrc-Skript kann das neue Dateisystem nicht sofort als / 
	    mounten. Zuerst muss es unter <command>/mnt</command> eingehängt
	    werden. Hiernach führt das Skript das Kommando 
	    <command>pivot_root</command> aus; pivot_root tauscht das aktuelle
	    root-Dateisystem mit dem neuen aus. War die Aktion erfolgreich, ist
	    das NFS-Dateisystem unter / gemountet und das alte root-Dateisystem
	    unter /oldroot.
	</para>
	<para></para>
    </listitem>
    
    <listitem>
    	<para>
	    Nach Mounten und Tauschen des neuen root-Dateisystems ist das 
	    /linuxrc-Script abgearbeitet und das eigentliche 
	    <command>/sbin/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 der Workstation entsprechend.
	</para>
	<para></para>
    </listitem>
    
    <listitem>
    	<para>
	    Einer der ersten Einträge in der inittab-Datei ist das
	    <command>rc.sysinit</command>-Kommando, welches aufgeführt wird,
	    während sich die Workstation in der 
	    '<emphasis role="strong">sysinit</emphasis>'-Phase befindet.
	</para>
	<para></para>
    </listitem>
    
    <listitem>
    	<para>
	    Das rc.sysinit-Skript 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 Schreibrechte besitzen müssen, existieren tatsächlich 
	    nur im Verzeichnis <filename class="directory">/tmp</filename>.
	    Symbolische Links verweisen dann von der notwendigen Position aus 
	    auf diese.
	</para>
	<para></para>
    </listitem>
    
    <listitem>
    	<para>
	    Dann wird das 
	    <filename class="directory">/proc</filename>-Dateisystem gemountet.
	</para>
	<para></para>
    </listitem>
    
    <listitem>
    	<para>
	    Anschließend wird die <filename>lts.conf</filename>-Datei
	    analysiert und alle zu dieser Workstation gehörenden Parameter in 
	    dieser Datei werden als Environment-Variablen, welche durch
	    das rc.sysinit-Skript genutzt werden, gesetzt.
	</para>
	<para></para>
    </listitem>
    
    <listitem>
    	<para>
	    Wurde die Workstation für Swapping über NFS konfiguriert, wird das
	    Verzeichnis <command>/var/opt/ltsp/swapfiles</command> unter
	    /tmp/swapfiles gemountet. Dann wird, falls noch keine Swap-Datei
	    für diese Workstation angelegt ist, eine erstellt. Die Größe der
	    Swap-Datei wird in der Datei <filename>lts.conf</filename> 
	    festgelegt.
	</para>
	<para>
	    Die erstellte Swap-Datei wird über das Kommando 
	    <command>swapon</command> aktiviert.
	</para>
	<para></para>
    </listitem>
    
    <listitem>
    	<para>
	    Das Netzwerk-Device <emphasis role="strong">loopback</emphasis> 
            wird konfiguriert.  Dies ist dasjenige Netzwerkinterface, welches 
	    die IP-Adresse <emphasis>127.0.0.1</emphasis> besitzt.
	</para>
	<para></para>
    </listitem>
    
    <listitem>
    	<para>
	    Wurde die Workstation so eingerichtet, dass lokale Anwendungen 
	    ausgeführt werden können, dann wird nun das 
	    <command>/home</command>-Verzeichnis vom Server gemountet, so dass 
	    die Programme Zugriff auf das Home-Verzeichnis der Benutzer haben.
	</para>
	<para></para>
    </listitem>
    
    <listitem>
    	<para>
	    Mehrere Verzeichnisse werden nun im 
	    <filename class="directory">/tmp/</filename>-Dateisystem angelegt,
	    damit dort Dateien abgelegt werden können, die während der Laufzeit 
	    des Client-Rechners notwendig sind. Folgende Verzeichnisse werden
	    erstellt:
	    <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>
    </listitem>
    
    <listitem>
    	<para>
	   Die Datei <filename>/tmp/syslog.conf</filename> wird erstellt. Sie
	   enthält Informationen darüber, zu welchem Host im Netzwerk der 
	   <command>syslog</command>-Daemon die Logging-Informationen senden
	   soll. Der syslog-Host wird in der Datei <filename>lts.conf</filename>
	   festgelegt. Es gibt einen symbolischen Link namens
	   <filename>/etc/syslog.conf</filename>, der auf die Datei
	   <filename>/tmp/syslog.conf</filename> verweist.
	</para>
	<para></para>
    </listitem>
    
    <listitem>
    	<para>
	   Nun kann der <command>syslogd</command>-Daemon, für den im vorigen
	   Schritt die Konfigurationsdatei erstellt wurde, gestartet werden.
	</para>
	<para></para>
    </listitem>
    
    <listitem>
    	<para>
	   Sobald das rc.sysinit-Skript abgearbeitet ist, wird die Kontrolle
	   an das /sbin/init-Programm zurück gegeben, das dann den Runlevel
	   von <emphasis role="strong">sysinit</emphasis> auf 
	   <emphasis role="strong">5</emphasis> ändert.
	</para>
	<para>
	   Das führt dazu, dass die anderen Einträge in der Datei 
	   <filename>/etc/inittab</filename> abgearbeitet werden.
	</para>
	<para></para>
    </listitem>
    
    <listitem>
    	<para>
	   Standartmäßig gibt es Einträge in der inittab, welche das Skript
	   <command>/etc/screen_session</command> auf tty1, tty2 und tty3
	   ausführt. Das bedeutet, dass drei Sessions zur gleichen Zeit laufen
	   können. Der Sessiontyp wird durch die Einträge 
	   <emphasis role="strong">SCREEN_01</emphasis>, 
	   <emphasis role="strong">SCREEN_02</emphasis> und
	   <emphasis role="strong">SCREEN_03</emphasis> in der 
	   <filename>lts.conf</filename>-Datei bestimmt.
	</para>
	<para>
	   Falls gewünscht, kann die Datei <filename>inittab</filename> um mehr 
	   Einträge für weitere Sessions ergänzt werden.
	</para>
	<para></para>
    </listitem>
    
    <listitem>
    	<para>
	   Ist <emphasis role="strong">SCREEN_01</emphasis> auf den Wert
	   <emphasis role="strong">startx</emphasis> gesetzt, wird das Skript
	   <command>/etc/screen.d/startx</command> ausgeführt, welches das
	   X-Window-System startet und eine graphische Benutzeroberfläche zur
	   Verfügung stellt.
	</para>
	<para>
	   In der Datei <command>lts.conf</command> gibt es einen Parameter
	   namens <command>XSERVER</command>. Fehlt dieser oder ist er auf
	   "<command>auto</command>" gesetzt, erfolgt ein Versuch, die 
	   Grafikkarte automatisch zu erkennen. Handelt es sich um eine PCI-
	   oder AGP-Grafikkarte, wird der PCI-Vendor und die Device-ID bestimmt
	   und die Datei <command>/etc/vidlist</command> wird daraufhin auf 
	   einen passenden Eintrag hin überprüft.
	</para>
	<para>
	   Wird die Karte von Xorg 6.7 unterstützt, gibt die pci_scan-Routine
	   den Namen des Treibermoduls zurück. Wird sie allerdings nur von
	   XFree86 3.3.6 unterstützt, gibt diese Routine den jeweiligen Namen
	   des zu benutzenden XServers zurück. Das startx-Skript kann das 
	   unterscheiden, da die alten 3.3.6-Servernamen mit 'XF86_' beginnen, 
	   während die neueren X-Server-Module von Xorg typischerweise klein 
	   geschrieben werden wie z.B. <emphasis>ati</emphasis> oder
	   <emphasis>trident</emphasis>.
	</para>
	<para></para>
    </listitem>
    
    <listitem>
    	<para>
	   Falls Xorg benutzt wird, erstellt das Skript 
	   <command>/etc/build_x4_cfg</command> eine XF86Config-Datei. Bei
	   XFree86 3.3.6 wird stattdessen <command>/etc/build_x3_cfg</command>
	   aufgerufen. Diese Dateien wrden im Verzeichnis 
	   <filename>/tmp</filename> abgelegt, das ja bekanntlich eine RAM-Disk
	   ist und ausschließlich von der jeweiligen Workstation gesehen wird.
	</para>
	<para>
	   Die XF86Config-Datei wird unter Verwendung der in der Datei
	   <command>/etc/lts.conf</command> gemachten Einträge erstellt.
	</para>
	<para></para>
    </listitem>
    
    <listitem>
    	<para>
	   Sobald die XF86Config-Datei erstellt ist, wird der X-Server durch
	   das <command>startx</command>-Skript unter Verwendung dieser neu 
	   erstellten Konfigurationsdatei gestartet.
	</para>
	<para></para>
    </listitem>
    
    <listitem>
    	<para>
	   Der X-Server sendet eine 
	   <emphasis role="strong">XDMCP</emphasis>-Anfrage an den LTSP-Server,
	   der daraufhin einen Login-Dialog zur Verfügung stellt.
	</para>
	<para></para>
    </listitem>
    
    <listitem>
    	<para>
	   An diesem Punkt kann sich der Benutzer einloggen und erhält eine
	   Session auf dem Server.
	</para>
	<para>
	   Anfangs irritiert dies viele Benutzer. Sie sitzen an einer 
	   Workstation, aber die Session läuft auf dem Server. Alle von ihnen
	   ausgeführten Kommandos laufen auf dem Server, aber ihre Ausgaben
	   erfolgen auf der Workstation.
	</para>
	<para></para>
    </listitem>
    </orderedlist>
</sect1>

<sect1>
  <title>Laden des Kernels in den Speicher</title>
  <para>
    Das Laden des Kernels in den Arbeitsspeicher der Workstation kann auf 
    verschiedene Weisen bewerkstelligt werden.
  </para>
  <itemizedlist>
    <listitem>
      <para>Boot ROM</para>
    </listitem>
    <listitem>
      <para>Lokales Speichermedium</para>
    </listitem>
  </itemizedlist>
  <para></para>

<sect2>
  <title>Boot ROM</title>
  <itemizedlist>
     <listitem>
       <para>Etherboot</para>
       <para>
         Etherboot ist ein sehr populäres Open-Source-Bootrom-Projekt. Es 
	 beinhaltet Treiber für viele gebräuchliche Netzwerkkarten und arbeitet
	 überdies sehr gut mit LTSP zusammen.
       </para>
       <para>
         Linux-Kernel müssen mit dem Kommando <command>mknbi-linux</command>
	 bearbeitet werden, welches den Kernel für das Booten über das 
	 Netzwerk vorbereitet, indem es dem Kernel zusätzlichen Code voranstellt
	 und das initrd-Image an dessen Ende anhängt.
       </para>
       <para>
         Die Kernel, die mit LTSP mitgeliefert werden, sind schon bearbeitet und
	 vorbereitet für das Booten mit Etherboot.
       </para>
       <para>
          Etherboot kann auch auf eine Diskette geschrieben werden, was beim Testen
	  überaus hilfreich sein kann.
       </para>
     </listitem>
     <listitem>
       <para>PXE</para>
       <para>
          Ein Teil der 'Wired for Management'-Spezifikation aus den späten
          90er Jahren enthielt eine Spezifikation für eine Bootrom-Technologie,
	  welche <emphasis>Pre-boot Execution Environment</emphasis> genannt 
	  wird und üblicherweise mit <emphasis role="strong">PXE</emphasis>
	  abgekürzt wird.
       </para>
       <para>
          Ein PXE-Bootrom kann höchstens eine 32 Kilobyte große Datei laden. Ein
	  Linux-Kernel ist ein ganzes Stück größer. Deswegen veranlassen wir PXE
	  dazu, einen Second-Stage-Bootloader - 
	  <emphasis role="strong">pxelinux</emphasis> genannt - zu laden. 
	  pxelinux ist klein genug, um geladen zu werden und weiß, wie größere
	  Dateien wie ein Linux-Kernel geladen werden können.
       </para>
     </listitem>
     <listitem>
     	<para>MBA</para>
	<para>
	   Ein Bootrom der Firma <emphasis role="strong">emBoot</emphasis> ist
	   der Managed Boot Agent (MBA). emBoot war früher die 
	   Lanworks-Abteilung von 3Com. MBA ist eigentlich eine Sammlung von 
	   vier Bootroms. Es kann mit PXE, TCP/IP, RPL und Netware umgehen.
	</para>
	<para>
	   Die MBA-Implementation von PXE läuft sehr gut. Man kann sie zusammen
	   mit pxelinux zum Booten des Linux-Kernels verwenden.
	</para>
	<para>
	   Die <emphasis role="strong">TCP/IP</emphasis>-Methode kann auch
	   genutzt werden. Allerdings muss der Kernel dafür mit dem Tool 
	   <command>imggen</command> aufbereitet werden.
        </para>
     </listitem>
     <listitem>
     	<para>Netboot</para>
	<para>
	   Netboot ist wie Etherboot ein freies Software-Projekt, das 
	   frei verfügbare Boot-ROM-Images zur Verfügung stellt. Im Unterschied
	   zu Etherboot ist es ein Wrapper um den NDIS- oder Packet-Treiber, welcher
	   mit der Netzwerkkarte geliefert wird.
	</para>
     </listitem>
  </itemizedlist>
</sect2>
<sect2>
  <title>Lokale Speichermedien</title>
  <itemizedlist>
     <listitem>
       <para>Diskette</para>
       <para>
          Es gibt zwei Wege, um eine LTSP-Workstation über Diskette zu booten.
	  Der eine Weg ist, ein Etherboot-Image in den Bootsektor der Diskette
	  zu laden. Auf diese Weise verhält sie sich wie ein Bootrom. Der
	  Bootcode wird ausgeführt, die Netzwerkkarte wird initialisiert und der
	  Kernel wird vom Netzwerk-Server geladen.
       </para>
       <para>
          Man kann auch das initrd-Image und den Kernel auf die Diskette 
	  kopieren und auf diese Weise booten. Allerdings ist es schneller, den
	  Kernel über das Netzwerk zu laden.
       </para>
     </listitem>
     <listitem>
       <para>Festplatte</para>
       <para>
          Die Festplatte kann mit LILO oder GRUB genutzt werden, um das 
	  initrd-Image und den Kernel zu laden. Oder man kann das
	  Etherboot-Bootrom-Image von der Festplatte laden, was sich dann wie
	  ein Bootrom verhält.
	</para>
     </listitem>
     <listitem>
     	<para>CD-ROM</para>
	<para>
	   Eine bootfähige CD-ROM kann entweder mit einem Linux-Kernel oder 
	   einem Etherboot-Image geladen werden.
	</para>
     </listitem>
     <listitem>
     	<para>USB-Speichergerät</para>
	<para>
	   Ein USB-Speichergerät kann genau wie eine CD-ROM, eine Diskette oder
	   Festplatte dazu genutzt werden, um entweder ein Etherboot-Modul oder
	   einen kompletten Linux-Kernel und ein initrd-Image zu booten.
	</para>
     </listitem>
   </itemizedlist>
</sect2>

</sect1>

</chapter>


<chapter>
   <title>Installation von LTSP auf dem Server</title>
   <para>
      LTSP kann man sich am besten als eine vollständige Linux-Distribution
      vorstellen. Sie setzt auf einer Host-Distribution auf. Diese kann jede
      beliebige Linux-Distribution sein. Tatsächlich braucht das Betriebssystem
      des Hosts nicht Linux zu sein.
      Die einzige Anforderung ist, dass das Host-System als NFS-Server 
      (NFS = Network File System) fungieren kann. Die meisten UNIX-Systeme
      können diese Bedingung erfüllen. Tatsächlich gibt es sogar einige
      Versionen von Microsoft Windows, die als LTSP-Server konfiguriert werden
      können.
   </para>
   
   <para>
      Es müssen drei Phasen beim Aufbauen eines LTSP-Servers durchlaufen werden:
      <itemizedlist>
      
        <listitem>
	  <para>Installieren der LTSP-Hilfsprogamme</para>
	</listitem>
	
	<listitem>
	  <para>Installieren der LTSP-Client-Pakete</para>
	</listitem>
	
	<listitem>
	  <para>Konfigurieren der von LTSP benötigten Dienste</para>
	</listitem>
      </itemizedlist>
   </para>

   <sect1>
      <title>Installation der LTSP-Hilfsprogramme</title>
      <para>
         Seit der Version 4.1 besitzt LTSP ein Paket von Hilfsprogrammen, um die
	 LTSP-Client-Pakete (die Programme, die auf den Thin Clients laufen) zu 
	 installieren und zu verwalten und um die Dienste auf dem LTSP-Server
	 zu konfigurieren.
      </para>
      
      <para>
         Das Adimistrations-Utility heißt <command>ltsadmin</command>, das
	 Konfigurations-Tool <command>ltspcfg</command>. Diese
	 beiden Hilfsprogramme sind Teil des 
	 <command>ltsp-utils</command>-Pakets.
      </para>
      
      <para>
         Das <emphasis role="strong">ltsp-utils</emphasis>-Paket ist sowohl im
	 <emphasis role="strong">RPM</emphasis>- als auch im
	 <emphasis role="strong">TGZ</emphasis>-Format verfügbar. Wählen Sie Ihr
	 bevorzugtes Format aus und folgen Sie den jeweiligen 
	 Instruktionen.
     </para>
     
     <sect2>
       <title>Installation des RPM-Pakets</title>
       <para>
          Laden Sie die neueste Version des ltsp-utils RPM-Pakets herunter und
	  installieren Sie es unter Verwendung des folgenden Kommandos:
	  <programlisting>
rpm -ivh ltsp-utils-0.11-0.noarch-rpm</programlisting>
	  Dieses Kommando installiert die Hilfsprogramme auf dem Server.
       </para>
    </sect2>
    
    <sect2>
      <title>Installation der TGZ-Pakete</title>
      <para>
         Laden Sie die neueste Version des ltsp-utils TGZ-Pakets herunter und 
	 installieren Sie es unter Verwendung der folgenden Befehle:
	 <programlisting>
tar xzf ltsp-utils-0.11-0.noarch.tgz
cd ltsp_utils
./install.sh
cd ..</programlisting>
	 Mit Hilfe dieser Befehle werden die Hilfsprogramme auf dem Server
	 installiert. Diese Installationsmethode sollte auf nicht-RPM-basierten
	 Systemen angewandt werden.
      </para>
    </sect2>
   </sect1>

   <sect1>
     <title>Installation der LTSP-Client-Pakete</title>
     <para>
        Sobald die Installation des ltsp-utils-Pakets abgeschlossen ist, kann
	das Kommando <command>ltspadmin</command> aufgerufen werden. Dieses
	Hilfsprogramm kann zur Verwaltung der LTSP-Client-Pakete genutzt werden.
	Es schickt eine Anfrage an das LTSP-Download-Repository und bekommt so
	eine Liste der zurzeit verfügbaren Pakete.
     </para>
     
     <para>
        Nach dem Aufruf des <command>ltspadmin</command>-Kommandos erscheint ein
	Bildschirm, der in etwa folgendes zeigt:
     </para>
     <para>
        <figure>
	  <title>Der Hauptbildschirm des LTSP-Installers</title>
	  <GRAPHIC FILEREF="pics/installer_main_window_de.jpg"
	  	   FORMAT="JPG"
		   SRCCREDIT="Martin Newiger, 2005">
	  </figure>
     </para>
     
     <para>
        Aus dem Menü können Sie "Install/Update" auswählen; wenn 
	Sie das erste Mal dieses Hilfsprogramm aufgerufen haben, wird der
	Installer-Konfigurations-Bildschirm angezeigt.
     </para>
     <para>
        <figure>
	<title>Der Konfigurationsbildschirm des LTSP-Installers</title>
	<GRAPHIC FILEREF="pics/installer_config_window_de.jpg"
		 FORMAT="JPG"
		 SRCCREDIT="Martin Newiger, 2005" >
	</figure>
      </para>
      
      <para>
         In diesem <emphasis role="strong">Konfigurations</emphasis>-Bildschirm 
	 können mehrere Werte gesetzt werden, die der Installer für das 
	 Herunterladen und Konfigurieren der Pakete benötigt. Diese Werte sind:
	 <variablelist>
	   <varlistentry>
	     <term><command>Where to retrieve the packages from?</command> 
	    	(Von welchem Server sollen die Pakete bezogen werden?)</term>
	     <listitem>
	       <para>
	          Das ist eine URL, die auf das Paket-Repository verweist.
		  Typischerweise wird es 
		  <filename>http://www.ltsp.org/ltsp-4.1</filename> sein. Wenn
		  Sie aber die Pakete von einem lokalen Dateisystem aus 
		  installieren wollen, können Sie <filename>file:</filename>
		  stattdessen verwenden. Befinden sich die Pakete z.B. auf einer
		  CD-ROM, die unter <filename>/mnt/cdrom</filename> gemountet 
		  ist, muss der Wert für das Paket-Respository wie folgt 
		  aussehen:
		  <filename>file:///mnt/cdrom</filename>. (Beachten Sie bitte
		  die drei /-Zeichen!)
	       </para>
	       <para></para>
	     </listitem>
	   </varlistentry>
	   <varlistentry>
	     <term><command>In which directory would you like to place the
	     LTSP client tree?</command> 
	     (In welchem Verzeichnis soll das LTSP-Client-Verzeichnis angelegt werden?)</term>
	     <listitem>
	       <para>
	          Dies ist das Verzeichnis auf dem Server, wo Sie den 
		  LTSP-Client-Verzeichnisbaum anlegen wollen. Typischerweise
		  sollte es <filename>/opt/ltsp</filename> sein. Dieses 
		  Verzeichnis wird erstellt, sofern es noch nicht existiert.
	       </para>
	       <para>
	          In diesem Verzeichnis werden die root-Verzeichnisse angelegt, 
		  pro Systemarchitektur eins. Zurzeit werden nur 
		  x86-Workstations offiziell unterstützt (i386-Architektur). 
		  Allerdings gibt es viele Leute, die an Portierungen auf andere 
		  Architekturen wie PPC und Sparc arbeiten.
	       </para>
	       <para></para>
	     </listitem>
	   </varlistentry>
	   <varlistentry>
	     <term><command>HTTP Proxy</command></term>
	     <listitem>
	       <para>
	          Befindet sich der Server hinter einer Firewall und der Zugriff
		  auf das Internet erfolgt immer über einen Proxy-Server, 
		  können Sie den Installer so einstellen, dass er diesen Proxy
		  verwendet. Der Wert für den Proxyserver sollte dessen URL, 
		  das verwendete Protokoll und den Port enthalten. Ein Beispiel
		  für solch eine Einstellung ist: 
		  <filename>http://firewall.yourdomain.com:3128</filename>
	       </para>
	       <para>
	          Benötigen Sie keinen Proxy, sollten Sie 
		  "<filename>none</filename>" eintragen.
	       </para>
	       <para></para>
	     </listitem>
	   </varlistentry>
	   <varlistentry>
	     <term><command>FTP Proxy</command></term>
	     <listitem>
	       <para>
	          Liegen die Pakete auf einem FTP-Server und Sie müssen, um auf
		  diesen zugreifen zu können, über einen FTP-Proxy gehen, geben
		  Sie diesen hier an. Die Syntax ist analog zu der des 
		  HTTP-Proxys von oben.
	       </para>
	       <para>
	          Benötigen Sie keinen Proxy, sollten Sie auch hier 
		  "<filename>none</filename>" eintragen.
	       </para>
	       <para></para>
	     </listitem>
	   </varlistentry>
	 </variablelist>
      </para>
      
      <para>
         Sobald Sie mit den Eingaben auf dem Konfigurationsbildschirm fertig
	 sind, fragt der Installer das Paket-Repository ab und erhält eine
	 Liste der zurzeit verfüg- und damit installierbaren Komponenten.
      </para>
      
      <para>
         <figure>
	   <title>Die vom LTSP-Installer erhaltene Komponentenliste</title>
	   <GRAPHIC FILEREF="pics/installer_comp_list_window_de.jpg"
	   	    FORMAT="JPG"
		    SRCCREDIT="Martin Newiger, 2005">
	</figure>
	Wählen Sie die Komponente aus, die Sie installieren möchten. Bewegen
	Sie dazu die hervorgehobene Zeile auf die von Ihnen gewünschte 
	Komponente und wählen Sie sie durch einen Druck auf die Taste 
	'<command>I</command>' aus. Sie können auch '<command>A</command>'
	drücken, um alle Komponenten auszuwählen. Meistens ist es das, was Sie
	wollen. Auf diese Weise wird eine große Palette von Thin-Client-Hardware
	unterstützt.
      </para>
      
      <para>
         Es gibt noch ein paar mehr Tasten, die Sie in diesem Bildschirm 
	 verwenden können. Durch Drücken der '<command>H</command>'-Taste 
	 erhalten Sie ein Hilfemenü, in dem diese Tasten genannt werden.
	 <figure>
	   <title>Das Hilfefenster des LTSP-Installers</title>
	   <GRAPHIC FILEREF="pics/installer_help_window_de.jpg"
                     FORMAT="JPG"
                     SRCCREDIT="Martin Newiger, 2005" >
         </figure>
      </para>
      <para>
         Wollen Sie eine Liste der Pakete sehen, welche zu einer bestimmten
	 Komponente gehören, drücken Sie die Taste '<command>S</command>'. Nun
	 werden die Pakete angezeigt. Außerdem erhält man Informationen über
	 die zurzeit installierten Pakete und deren aktuell verfügbare 
	 Versionen.
	 <figure>
	   <title>Die Paketliste im LTSP-Installer</title>
	   <GRAPHIC FILEREF="pics/installer_pkg_list_window_de.jpg"
	   	    FORMAT="JPG"
		    SRCCREDIT="Martin Newiger, 2005">
	 </figure>
      </para>
      
      <para>
         Sobald Sie alle gewünschten Komponenten ausgewählt haben, können Sie
	 den Komponentenauswahl-Bildschirmm verlassen. Der Installer wird Sie
	 dann fragen, ob Sie wirklich die gewählten Pakete 
	 updaten/installieren wollen. Bestätigen Sie das mit der 
	 '<command>Y</command>'-Taste, wird der Installer mit dem Herunterladen
	 und dem Installieren der Pakete beginnen.
      </para>
   </sect1>
   
   <sect1>
      <title>Konfiguration der von LTSP benötigten Dienste</title>
      <para>
         Es gibt vier grundlegende Dienste, die für das Booten einer
	 LTSP-Workstation benötigt werden. Diese sind:
	 <itemizedlist>
	   <listitem><para>DHCP</para></listitem>
	   <listitem><para>TFTP</para></listitem>
	   <listitem><para>NFS</para></listitem>
	   <listitem><para>XDMCP</para></listitem>
	</itemizedlist>
      </para>
      
      <para>
         Das Kommando <command>ltspcfg</command> kann dafür verwendet werden,
	 alle diese Dienste zu konfigurieren plus einiger LTSP-bezogenen Dinge
	 mehr.
      </para>
      
      <para>
         Sie können <command>ltspcfg</command> über das Programm
	 <command>ltspadmin</command> oder direkt über die Kommandozeile
	 aufrufen, indem Sie <command>ltspcfg</command> eingeben.
      </para>
      
      <para>
      	 Wenn Sie das ltspcfg-Hilfprogramm ausführen, scannt es den Server, um
	 zu schauen, was installiert ist und was gerade ausgeführt wird. Sie
	 bekommen einen Bildschirm, der in etwa folgendermaßen aussieht:
	 <figure>
	   <title>Der Eingangsbildschirm von ltspcfg</title>
	   <GRAPHIC FILEREF="pics/ltspcfg_initial_screen_de.jpg"
	   	    FORMAT="JPG"
		    SRCCREDIT="Martin Newiger, 2005" >
         </figure>
	 Dieser Bilschirm zeigt alle durch den Scanprozess des Hilfsprogramms 
	 erhaltenen Informationen an.
       </para>
       <para>
          Durch Drücken der Taste '<command>C</command>' gelangen Sie zu dem
	  Konfigurationsmenü. Sie müssen jeden einzelnen Eintrag durchgehen, um
	  sicherzustellen, dass der LTSP-Server für die Bedienung der
	  Workstations korrekt konfiguriert ist.
          
	  <figure>
	    <title>Das ltspcfg-Konfigurationsmenü</title>
	    <GRAPHIC FILEREF="pics/ltspcfg_service_list_de.jpg"
	    	     FORMAT="JPG"
		     SRCCREDIT="Martin Newiger, 2005" >
         </figure>
	 
	 <variablelist>
	   <varlistentry>
	     <term><command>1 - Runlevel</command></term>
	     <listitem>
	       <para>
	          Die Variable <command>Runlevel</command> wird durch das 
		  Programm <command>init</command> verwendet. Bei Linux- und
		  Unix-Sytemen befindet sich das System zu jedem Zeitpunkt in
		  einem spezifischen "Runlevel". Die Runlevel 2 und 3 werden
		  typischerweise genutzt, wenn sich der Server im Text-Modus
		  befindet. Runlevel 5 hingegen zeigt typischerweise an, dass 
		  sich das System im graphischen Modus in einem Netzwerk 
		  befindet.
	       </para>
	       <para>
	          Bei einem LTSP-Server wird traditionell der Runlevel 5
		  verwendet. Die meisten Systeme sind bereits so konfiguriert, 
		  dass sie NFS und XDMCP in jenem Runlevel bedienen können. 
		  Dieses Hilfsprogramm konfiguriert diejenigen Systeme, die dies 
		  nicht können, entsprechend.
	       </para>
	     </listitem>
	   </varlistentry>
	   
	   <varlistentry>
	     <term><command>2- Interface selection</command></term>
	     <listitem>
	       <para>
	          Sollte das System über mehrere Netzwerkkarten verfügen, können
		  Sie hier dasjenige Interface auswählen, mit welchem die
		  Thin Clients verbunden sind.
	       </para>
	       <para>
	          Durch die Auswahl des Interfaces kann das Konfigurationstool
		  korrekte Konfigurationsdateien wie z.B. die Datei
		  <filename>dhcpd.conf</filename> oder die 
		  <filename>/etc/exports</filename>-Datei erstellen.
	       </para>
	     </listitem>
	   </varlistentry>
	   
	   <varlistentry>
	     <term><command>3 - DHCP configuration</command></term>
	     <listitem>
	       <para>
	          DHCP muss so konfiguriert werden, dass die von der
		  Workstation benötigten Felder an sie weitergegeben werden.
		  Unter diesen Feldern sind die folgenden: 
		  <command>fixed-address</command>, <command>filename</command>,
		  <command>subnet-mask</command>,
		  <command>broadcast-address</command> und 
		  <command>root-path</command>.
	       </para>
	       <para>
	          Durch Auswahl dieses Menüpunkts können Sie eine
		  <filename>dhcpd.conf</filename>-Konfigurationsdatei erstellen
		  und den <command>dhcpd</command>-Daemon so konfigurieren, dass
		  er beim Systemstart automatisch geladen wird.
	       </para>
	     </listitem>
	   </varlistentry>
	   
	   <varlistentry>
	     <term><command>4 - TFTP configuration</command></term>
	     <listitem>
	       <para>
	          TFTP wird vom Thin Client genutzt, um den Linux-Kernel
		  herunterzuladen. Der <command>tftpd</command>-Dienst muss auf
		  dem Server aktiviert werden, um den Kernel zum Download
		  bereit stellen zu können.
	       </para>
	     </listitem>
	   </varlistentry>
	   
           <varlistentry>
	     <term><command>5 - Portmapper configuration</command></term>
	     <listitem>
	       <para>
	          Der <command>Portmapper</command> wird von den RPC-Diensten
		  genutzt. Jeder RPC-Service wie z.B. NFS muss sich beim
		  Portmapper beim Start registrieren und ihm u.a. die von ihm
 		  verwendete Portnummer mitteilen. Bei Anfragen eines
		  RPC-Clients an den Portmapper nach einem konkreten RPC-Dienst
		  durchsucht dieser seine Datenbasis und übergibt, falls der
		  Dienst verfügbar ist, dessen Portnummer. Alle Clientzugriffe
		  erfolgen später direkt an diesen Port.
	       </para>
	     </listitem>
	   </varlistentry>
	   
	   <varlistentry>
	     <term><command>6 - NFS configuration</command></term>
	     <listitem>
	       <para>
	          Der NFS-Dienst erlaubt es, dass lokale Verzeichnisbäume auf
		  entfernten Maschinen gemountet werden können. Diese 
		  Eigenschaft ist für LTSP erforderlich, da die Workstations
		  ihr root-Dateisystem vom Server mounten.
	      </para>
	      <para>
	         Unter diesem Menüpunkt wird der NFS-Daemon so eingerichtet, 
		 dass er beim Bootvorgang automatisch gestartet wird. Die
		 Konfigurationsdatei <filename>/etc/exports</filename> und ihre
		 Erstellung werden später in diesem Abschnitt beschrieben.
	      </para>
	     </listitem>
	   </varlistentry>
	   
	   <varlistentry>
	     <term><command>7 - XDMCP configuration</command></term>
	     <listitem>
	     	<para>
		   XDMCP heißt: "X Display Manager Control Protocol". Der 
		   X-Server sendet eine XDMCP-Anfrage an den Display-Manager
		   des Servers, um einen Login-Prompt zu erhalten.
		</para>
		<para>
		   Gewöhnlich werden <command>XDM</command>, 
		   <command>GDM</command> und <command>KDM</command> als
		   Display-Manager verwendet. Dieser Menüpunkt zeigt die
		   gefundenen Display-Manager an. Außerdem erfolgt naoch die 
		   Anzeige des Display-Managers, der für die Ausführung 
		   konfiguriert ist.
		</para>
		<para>
		   Aus Sicherheitsgründen ist der Display-Manager so 
		   konfiguriert, dass sich Remote-Workstations mit ihm verbinden
		   können. Dies ist die Ursache für den berühmten 
		   <emphasis role="strong">grauen Bildschirm mit dem großen
		   X-Cursor</emphasis>. Gewöhnlich kann ltspcfg den
		   Display-Manager so konfigurieren, dass Remote-Workstations
		   eine Verbindung mit ihm bekommen.
		</para>
	     </listitem>
	   </varlistentry>
	   
	   <varlistentry>
	     <term><command>8 - Create /etc/host entries</command></term>
	     <listitem>
	       <para>
	          Viele Dienste wie NFS und der Display-Manager müssen in der
		  Lage sein, der IP-Adresse einer Workstation einen 
		  entsprechenden Hostnamen zuzuordnen. Dies kann durch den 
		  Einsatz des Berkeley Internet Naming Daemon (BIND) erreicht
		  werden. Allerdings muss dabei sicher gestellt sein, dass
		  auch der <emphasis role="strong">Reverse</emphasis>-Lookup
		  richtig funktioniert (d.h. einem Hostnamen muss die 
		  entsprechende IP-Adresse zugeordnet werden können). Der 
		  Einsatz von BIND ist letztlich die beste Wahl, um dies zu
		  erledigen, aber die Konfiguration von BIND würde den Rahmen
		  dieses Dokuments sprengen und hat nichts mit dem 
		  ltspcfg-Hilfsprogramm zu tun.
               </para>
	       <para>
	          Eine einfachere Methode, um IP-Adressen Hostnamen 
		  zuzuordnen, ist die Verwendung der Datei 
		  <filename>/etc/hosts</filename>.
	       </para>
	     </listitem>
	   </varlistentry>
	   
	   <varlistentry>
	     <term><command>9 - Create /etc/hosts.allow entries</command></term>
	     <listitem>
	       <para>
	         Einige Dienste benutzen einen Security-Layer, welcher
		 <emphasis role="strong">tcpwrappers</emphasis> genannt wird.
		 Dieser wird durch die Datei 
		 <filename>/etc/hosts.allow</filename> konfiguriert. Dieser
		 Menüpunkt erstellt eine solche Datei für Sie.
	       </para>
	     </listitem>
	   </varlistentry>
	   
	   <varlistentry>
	     <term><command>10 - Create the /etc/exports file</command></term>
	     <listitem>
	       <para>
	          Anfhand dieser Datei kann NFS feststellen, welche 
		  Verzeichnisse auf entfernten Maschinen gemountet werden 
		  dürfen. Dieser Menüpunkt erstellt diese Datei.
	       </para>
	    </listitem>
	   </varlistentry>
	   
	   <varlistentry>
	     <term><command>11 - Create the lts.conf file</command></term>
	     <listitem>
	       <para>
	          Die Konfiguration jeder einzelnen Workstation erfolgt anhand
		  der Einträge in der Datei <filename>lts.conf</filename>.
		  Werden relativ neue Workstations mit PCI-Bus eingesetzt,
		  braucht die Datei lts.conf keine zusätzlichen Einträge. Sie
		  muss allerdings existieren. Dieser Menüpunkt erstellt die
		  Default-lts.conf-Datei für Sie.
	       </para>
	     </listitem>
	   </varlistentry>
         </variablelist>
       </para>
   </sect1>
   
   <sect1>
       <title>Workstation-spezifische Konfiguraton</title>
       <para>
          Nun ist es an der Zeit, den LTSP-Server über jede einzelne
	  Workstation in Kenntnis zu setzen. Es gibt drei Dateien, die 
	  Informationen über diese Workstation 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>
	     Die Workstation braucht eine IP-Adresse und weitere Informationen. 
	     Sie bekommt folgende Informationen vom DHCP-Server:
	     <itemizedlist>
	        <listitem><para>IP-Adresse</para></listitem>
	        <listitem><para>Hostname</para></listitem>
	        <listitem><para>Server-IP-Adresse</para></listitem>
	        <listitem><para>Default Gateway</para></listitem>
	        <listitem><para>Pfadname des zu ladenden Kernels</para></listitem>
	        <listitem><para>Servername und Verzeichnispfad auf dem Server, 
		  der als root-Dateisystem gemountet werden soll</para></listitem>
	     </itemizedlist>
	  </para>
	  <para>
	     In unserer Beispielkonfiguration weisen wir per DHCP-Server den 
	     Clients ihre IP-Adressen zu.
	  </para>
	  <para>
	     Während das ltspcfg-Skript abläuft, wird eine Beispieldatei für 
	     dhcpd.conf erstellt. Sie heißt
	     <filename>/etc/dhcpd.conf.example</filename>. Sie können sie nach 
	     /etc/dhcpd.conf kopieren und diese Datei dann als Basis für Ihre
	     DHCP-Konfiguration benutzen. Selbstverständlich müssen Sie 
	     Anpassungen an Ihre eigene Systemumgebung vornehmen und die Angaben 
	     zu den Workstations anpassen.
	     <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-Pakets 
	      enthalten Treibermodule für alle von Linux unterstützten 
	      Netzwerkkarten. Es gibt zwei Kernel im LTPS-Kernel-Paket. Einer 
	      enthält den Linux Progress Patch (LPP), der andere nicht. 
	      Sie sind an ihren Namen zu erkennen; beispielsweise:
	      <programlisting>
vmlinuz-2.4.9-ltsp-5
vmlinuz-2.4.9-ltsp-lpp-5 </programlisting>
          </para>
	  
	  <para>
	     Vielleicht ist Ihnen aufgefallen, dass 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 Version 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>
	     Andere Linux-Distribution verwenden möglicherweise die Option '-s' 
	     nicht für tftpd. Daher müssen Sie 
	     <filename class="directory">/tftpboot</filename> vor den Pfadnamen 
	     des Kernels setzen.
	  </para>
       </sect2>
       
       <sect2>
          <title>/etc/hosts</title>
	  <para>Umwandlung von IP-Adressen zu Hostnamen</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 eine Umwandlung von IP-Adressen in Hostnamen 
	     unverzichtbar, da es sonst keinen Zugriff der Workstations auf das 
	     vorgesehene root-Verzeichnis auf dem Server per NFS gibt.
	  </para>
	  
	  <para>
	     Außerdem könnte es bei fehlendem Eintrag der Workstation in der 
	     Datei <filename>/etc/hosts</filename> zu Problemen mit den
	     Display-Managern <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 der Datei <filename>lts.conf</filename> 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 Workstations gilt: <command>[default]</command> und es kann 
	     für einzelne Workstations spezifische Einträge geben. Die
	     Workstation kann durch den Rechnernamen, die IP-Adresse oder die 
	     MAC-Adresse identifiziert werden.
	  </para>
	  
	  <para>
	     Eine <filename>lts.conf</filename>-Datei sieht üblicherweise 
	     folgendermaßen aus:
	     <example>
	         <title>lts.conf-Datei</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
        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>
		       Ist Ihre Grafikkarte eine PCI-Karte und wird diese von
		       X.org 6.7.0 unterstützt, dann brauchen Sie nur das
		       lts_x_core-Paket. Dieses enthält alle für X4 notwendigen
		       Treibermodule.
		    </para>
		    <para>
		       Es gibt auch mehrere XFree86-3.3.6-Pakete für LTSP für 
		       den Fall, dass Ihre Karte nicht von X.org 6.7.0 
		       unterstützt wird.
		    </para>
		    <para>
		       Einträge können in der Datei <filename>lts.conf</filename> 
		       pro Workstation oder zentral in der default-Sektion 
		       erfolgen.
		    </para>
		    <para>
		       Da unsere Beispiel-Workstation über einen Intel i810 
		       Video-Chipsatz verfügt, der automatisch erkannt wird, 
		       braucht kein XSERVER-Eintrag gemacht zu werden. Wenn Sie 
		       wollen, können Sie 'auto' oder das entsprechende
		       Treibermodul eintragen.
		    </para>
		  </listitem>
	       </varlistentry>
	       
	       <varlistentry>
	          <term><command>RUNLEVEL</command></term>
		  <listitem>
		    <para>
		       Wir wollen die Workstation im Grafikmodus betreiben,
		       daher setzen wir den Runlevel auf '5'. Dies wird durch
		       einen weiteren Eintrag in der Datei 
		       <filename>lts.conf</filename> gemacht.
		    </para>
		  </listitem>
	       </varlistentry>
	     </variablelist>
          </para>
       </sect2>
   </sect1>
   
   <sect1>
     <title>Anzeigen der aktuellen Konfiguration</title>
     <para>
        Mit <command>ltspcfg</command> können Sie einen Überblick über den
	aktuellen Status der für LTSP erforderlichen Dienste erhalten. Dazu
	müssen Sie im ltspcfg-Hauptmenü die Taste '<command>S</command>'
	drücken, um den aktuellen Status angezeigt zu bekommen.
	
	<figure>
          <title>ltspcfg - Aktueller Status</title>
          <GRAPHIC FILEREF="pics/ltspcfg_status_de.jpg"
                   FORMAT="JPG"
                   SRCCREDIT="Martin Newiger, 2005" >
        </figure>
     </para>
   </sect1>
</chapter>


<chapter>
   <title>Einrichtung der Workstation</title>
   <para>
      Nachdem die Einrichtung des Servers abgeschlossen ist, ist es an der Zeit,
      den Fokus auf die Workstation zu verlagern.
   </para>
   
   <para>
      LTSP beginnt dann, wenn der Kernel in den Arbeitsspeicher der
      Workstation geladen wurde. Es gibt mehrere Wege, den Kernel zu laden: 
      Etherboot, Netboot, PXE und Diskette.
   </para>
   
   <sect1>
     <title>Booten mit PXE</title>
     <para>
        Verfügt Ihre Netzwerkkarte oder Ihr PC über PXE, kann es zum Laden des
	Linux-Kernels verwendet werden. PXE ist eine Bootrom-Technologie, die
	der von Ether- oder Netboot ähnlich ist.
     </para>
     
     <para>
        Sie müssen möglicherweise das PXE-Bootrom auf Ihrer Netwerkkarte
	aktivieren. Außerdem müssen Sie eventuell die Bootreihenfolge in Ihrem
	BIOS ändern. Sie muss so eingestellt werden, dass "Boot from LAN" der
	erste Eintrag in der Bootreihenfolge ist und nicht das 
	Diskettenlaufwerk oder gar die Festplatte.
     </para>
     
     <para>
     	PXE besitzt eine Einschränkung: es ist nur in der Lage, Dateien zu laden,
	die 32kb oder kleiner sind. Der Linux-Kernel ist wesentlich größer. Sie
	können ihn also nicht direkt mit PXE laden. Sie brauchen hierfür ein
	Programm, was als 'Network Bootstrap Program' oder kurz als NBP 
	bezeichnet wird.
     </para>
     
     <para>
        Zum Laden des Linux-Kernels gibt es ein NBP namens 
	<command>pxelinux.0</command>. Es ist Bestandteil des Pakets 
	<command>syslinux</command> von Kernel-Entwickler H. Peter Anvin.
     </para>
     
     <para>
     	Das LTSP-Kernel-Paket enthält das pxelinux.0-NBP und eine 
	Konfigurationsdatei, mit deren Hilfe der Linux-Kernel und ein 
	Initial-RAMdisk-Image geladen werden können.
     </para>
     
     <para>
     	Der Ladevorgang läuft folgendermaßen ab:
	<itemizedlist>
	  <listitem>
	    <para>
	      Das PXE-Bootrom initialisiert die Netzwerkarte und sendet eine
	      DHCP-Anfrage.
	    </para>
	  </listitem>
	  <listitem>
	    <para>
	      Der DHCP-Server antwortet, indem er eine IP-Adresse und den Namen
	      des zu ladenden NBPs zurück schickt.
	    </para>
	  </listitem>
	  <listitem>
	    <para>
	      Das PXE-Bootrom lädt das NBP herunter, platziert es im Speicher 
	      und beginnt mit dessen Ausführung.
	    </para>
	  </listitem>
	  <listitem>
	    <para>
	      Das NBP nutzt tftp, um die Konfigurationsdatei vom Server 
	      herunter zu laden.
	    </para>
	  </listitem>
	  <listitem>
	    <para>
	      Die Konfigurationsdatei enthält den Namen des Kernels, den Namen
	      der Initial-RAMdisk-Datei und Optionen, welche dem Kernel übergeben 
	      werden nachdem dieser geladen ist.
	    </para>
	  </listitem>
	  <listitem>
	    <para>
	      Eine pxelinux-Konfigurationsdatei sieht in etwa wie folgt aus:
	      <programlisting>
prompt=0
label linux
        kernel bzImage-2.4.24-ltsp-4
        append init=/linuxrc rw root=/dev/ram0 initrd=initrd-2.4.24-ltsp-4.gz
              </programlisting>
            </para>
          </listitem>
          <listitem>
            <para>
              Das NBP benutzt nun tftp, um den Linux-Kernel und die 
	      Initial-RAMdisk-Datei (initrd) herunter zu laden.
            </para>
          </listitem>
	  <listitem>
	    <para>
	      Die Kontrolle wird dann an den Linux-Kernel gegeben. Dieser
	      bootet, mountet das initrd-Image und setzt dann das Starten des
	      Thin Clients fort.
	    </para>
	  </listitem>
	</itemizedlist>
     </para>
   </sect1>
   
   <sect1>
     <title>Booten mit Etherboot</title>
     <blockquote><attribution>Ken Yap</attribution>
       <para>
          Etherboot ist ein Softwarepaket zum Erstellen von ROM-Images, die über
	  das Netzwerk geladen werden und auf einem x86-Computer ausgeführt
	  werden können. Viele Netzwerkkarten besitzen einen Sockel, auf den
	  ein ROM-Chip gesteckt werden kann. Etherboot ist der Code, der auf ein
	  solches ROM gebracht werden kann.
       </para>
     </blockquote>
     
     <para>
        Etherboot ist auch Open Source und durch die GNU General Public License
	Version 2 (GPL2) geschützt.
     </para>
     
     <para>
        Wenn Sie eine Netzwerkkarte mit Etherboot-Bootrom besitzen und diese
	zusammen mit Etherboot einsetzen wollen, müssen Sie Ihr BIOS so 
	einstellen, dass "Boot from LAN" der erste Eintrag in der 
	Bootreihenfolge ist und nicht das Diskettenlaufwerk oder gar die 
	Festplatte.
     </para>
     
     <para>
        Besitzen Sie kein Etherboot-Bootrom, können Sie entweder ein Bootrom
	herstellen oder eine Diskette mit einem Etherboot-Image erstellen, 
	das sich dann im Bootsektor der Diskette befindet.
     </para>
     
     <para>
        Etherboot unterstützt eine breite Palette an Netzwerkkarten. Derzeit
	sind es über 200 und es kommen immer neue hinzu. Gleichgültig, ob Sie
	eine Diskette erstellen oder den Code auf ein Eprom brennen: Sie müssen
	vorher ermitteln, welches Netzwerkkartenmodell Sie besitzen.
     </para>
     
     <sect2>
       <title>Auswählen eines Etherboot-Treibers für eine ISA-Netzwerkkarte</title>
       <para>
       	  Bei älteren ISA-basierten Netzwerkkarten ist es nicht so wichtig, dass
	  Sie den exakten Typ bestimmen. Die meisten Karten sind entweder 
	  ne2000- oder 3Com 3c509-Karten. Sie müssen lediglich den richtigen
	  Etherboot-Treiber wählen: Es muss derjenige sein, der auf Karten mit zwei 
	  Anschlussmöglichkeiten, wie 10Base-2 (Koax) und 10Base-T (Twisted Pair), 
	  den korrekten Medientyp auswählt.
       </para>
     </sect2>
     
     <sect2>
       <title>Auswählen eines Etherboot-Treibers für eine PCI-Netzwerkkarte</title>
       <para>
          Bei PCI-Karten ist es wichtig, dass Sie den Etherboot-Treiber 
	  auswählen, der mit dem PCI-Vendor und der Device-ID Ihrer
	  Netzwerkkarte übereinstimmt.
       </para>
      
       <para>
          Im besten Falle wissen Sie die exakte Modellbezeichnung Ihrer Karte, 
	  da sie auf der Karte aufgedruckt ist. Wenn diese Bezeichnung ganz 
	  genau mit der Bezeichnung eines der Etherboot-Module übereinstimmt, 
	  haben Sie Glück. Meistens jedoch müssen Sie die PCI-ID-Nummern erst 
	  finden.
       </para>
      
       <para>
          Ist Ihre Workstation mit einem Diskettenlaufwerk ausgestattet, können
	  Sie eine tomsrtbt-Diskette (Tom's Root Boot) booten. Besitzt Ihre
	  Workstation ein CD-ROM-Laufwerk, können Sie einfach eine Knoppix-CD
	  booten.
	  Wenn Sie Linux auf Ihrer Workstation allerdings nicht booten können,
	  müssen Sie als letzten Versuch die Netzwerkkarte in einen Rechner
	  einbauen, der in der Lage ist, Linux zu starten.
       </para>
       
       <para>
          Nachdem Sie Linux gestartet haben, können Sie das Kommando
	  <command>lspci</command> mit der Option '-n' nutzen. Sie erhalten dann
	  in etwa folgende Bildschirmausgabe:
	  <programlisting>
[root@jamlap root]# lspci -n
0000:00:00.0 Class 0600: 8086:7190 (rev 03)
0000:00:01.0 Class 0604: 8086:7191 (rev 03)
0000:00:03.0 Class 0607: 104c:ac1c (rev 01)
0000:00:03.1 Class 0607: 104c:ac1c (rev 01)
0000:00:07.0 Class 0680: 8086:7110 (rev 02)
0000:00:07.1 Class 0101: 8086:7111 (rev 01)
0000:00:07.2 Class 0c03: 8086:7112 (rev 01)
0000:00:07.3 Class 0680: 8086:7113 (rev 03)
0000:00:08.0 Class 0401: 125d:1978 (rev 10)
0000:01:00.0 Class 0300: 1002:4c4d (rev 64)
0000:06:00.0 Class 0200: 8086:1229 (rev 09)
          </programlisting>
          In dem obigen Beispiel können Sie sehen, dass ein Eintrag für jede 
          PCI-Karte im System existiert. Sie brauchen sich nur die 
          <emphasis role="strong">Class 0200</emphasis>-Geräte anschauen. Sie
          können das Kommando nochmal aufrufen und sich diesmal nur die
          Ethernet-Interfaces anzeigen lassen. Auf diese Weise wird die Liste
          übersichtlicher.
          <programlisting>
[root@jamlap root]# lspci -n | grep "Class 0200"
0000:06:00.0 Class 0200: 8086:1229 (rev 09)
          </programlisting>
          Die PCI-ID-Nummern sind: <command>8086:1229</command>. Das erste Feld
          <command>8086</command> bezeichnet den PCI-Vendor (Hersteller). In
	  diesem Beispiel ist der Hersteller die Intel Corporation. Das zweite
	  Feld <command>1229</command> bezeichnet die PCI-Device-ID. Diese gibt
          Aufschluss über das Modell der Netzwerkkarte. Hier ist es eine
          EtherExpress-100-Karte.
       </para>
     </sect2>
     
     <sect2>
       <title>Eine Bootdiskette erstellen</title>
       <para>
          Sie können das Etherboot-Paket herunter laden und ein passendes Image 
	  herstellen, das dann in ein EPROM gebrannt oder erst einmal zu 
	  Testzwecken auf eine Diskette kopiert werden kann.
       </para>
       
       <para>
          Es ist eine einfachere Alternative, auf Marty Connors Webseite unter 
	  der URL
	  <ulink url="http://www.rom-o-matic.net"><citetitle>www.Rom-O-Matic.net</citetitle></ulink>
	  zu gehen.
       </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. Danach haben Sie die Möglichkeit, viele Konfigurationsoptionen
	  zu modifizieren. Nachdem alles eingegeben ist, reicht ein Klick auf 
	  den Button 'Get ROM', um das Image generieren zu lassen.
       </para>
       
       <para>
          Als 'ROM output format' wählen Sie '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 beim 
	  Start des Rechners per Diskette das Image in den Arbeitsspeicher, wo 
	  es dann ausgeführt werden kann.
       </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. Nach einiger Zeit erscheint ein
	  'Speichern als'-Fenster und Sie können auswählen, wohin das 
	  Bootrom-Image auf Ihrem Rechner gespeichert werden soll.
       </para>
       
       <para>
          Nachdem Sie das Image auf der Festplatte gespeichert haben, müssen
	  Sie es auf eine Diskette schreiben. Legen Sie die Diskette in das
	  Laufwerk ein und geben Sie das folgende Kommando ein, um das Image
	  auf die Diskette zu schreiben:
	  <programlisting>
dd if=<emphasis>Etherboot_Image</emphasis> of=/dev/fd0 </programlisting>
       </para>
     </sect2>
     
     <sect2>
       <title>Erstellen eines Bootroms</title>
       <para>
          Um ein Etherboot-Image auf ein EPROM zu schreiben, benötigen Sie einen
	  EPROM-Schreiber. Dieses Gerät kann von mehreren hundert bis zu einigen 
	  tausend Dollar kosten, was von dem Leistungsumfang abhängig ist.
       </para>
       
       <para>
          Der Bootrom-Erstellungsprozess ist komplett vom EPROM-Schreiber
	  abhängig. Die Beschreibung eines solchen Vorgangs würde den Rahmen
	  dieses Dokuments sprengen.
       </para>
     </sect2>
   </sect1>
</chapter>


<chapter>
    <title>Starten der Workstation</title>
    <para>
       Wurde alles richtig auf dem Server konfiguriert, kann die Workstation
       per Diskette oder Netzwerk (PXE, Etherboot) gestartet werden.
    </para>
    
    <para>
       Der Bootcode wird in den Speicher geladen, die Netzwerkkarte wird 
       gefunden 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 screen</title>
        <GRAPHIC FILEREF="pics/ltsplogin1.gif"
                 FORMAT="GIF"
                 SRCCREDIT="James McQuillan, 2001" >
    </figure>
    
    <para>
       Ein normales Einloggen sollte nun möglich sein. Wichtig ist: Sie melden 
       sich auf dem Server an und arbeiten dort. Alle Kommandos werden auf dem 
       Server aufgeführt, die Ausgaben werden auf dem Monitor der 
       Workstation dargestellt. Das ist die Netzwerkfähigkeit des 
       X-Window-Systems.
    </para>
    
    <para>
        Alle Programme auf dem Server stehen zur Verfügung.
    </para>
</chapter>


<chapter>
    <title>Drucken</title>
    <para>
       Die Workstation kann neben ihrer Rolle als voll funktionsfähiges
       (ASCII- oder graphisches) Terminal auch noch als Printserver genutzt
       werden. Bis zu drei Drucker können an die parallelen und seriellen Ports
       angeschlossen werden.
    </para>
    
    <para>
       Für den Benutzer der Workstation ist dies transparent; die zusätzliche
       Netzwerklast wird kaum bemerkbar sein.
    </para>
    
    <sect1>
       <title>Einrichten der Workstation</title>
       <para>
          LTSP benutzt das <command>lp_server</command>-Programm auf der
	  Workstation, um die Druckaufträge des Servers auf ihre Ports
	  umzuleiten.
       </para>
       
       <para>
          Es gibt einige Einträge in der Konfigurationsdatei
	  <command>lts.conf</command>, um das Drucken über eine Workstation 
	  zu steuern:
	  <programlisting>
[ws001]
    PRINTER_0_DEVICE = /dev/lp0
    PRINTER_0_TYPE   = P </programlisting>
    	  Der obige Eintrag lässt das lp_server-Programm als Daemon laufen, der
	  auf dem TCP/IP-Port 9100 auf Druckaufträge wartet. Der Drucker am
	  ersten parallelen Anschluss (/dev/lp0) der Workstation bekommt die
	  Daten durchgereicht.
       </para>
       
       <para>
          Es gibt viele weitere Einstellmöglichkeiten für das Drucken. Sie
	  finden 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>
         Fedora Core (Redhat) besitzt dafür sowohl GUI- als auch textbasierte 
	 Tools. Das GUI-Tool heißt <command>printconf-gui</command> und das 
	 textbasierte <command>printconf-tui</command>. Außerdem gibt es noch
	 ein Programm namens <command>printtool</command>. Printtool gibt es 
	 auch in Fedora, aber in diesem Beispiel benutzen wir printconf-gui. 
	 Andere Linux-Distributionen haben ihre eigenen Konfigurationstools.
      </para>
      
      <figure>
        <title>Einen neuen Drucker mit printconf-gui erstellen</title>
        <GRAPHIC FILEREF="pics/printconf_gui_add_de.jpg"
                 FORMAT="JPG"
                 SRCCREDIT="Martin Newiger, 2005" >
        </figure>
	
	<para>
	   Nach Aufruf des Tools definieren wir einen neuen Drucker. 
	   Das lp_server-Programm kann auf der Workstation einen 
	   HP-JetDirect-Printserver emulieren. Auf dem Server muss daher ein 
	   JetDirect-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>"-" Bindestrich</computeroutput></para>
	     </listitem>
	     <listitem>
	       <para><computeroutput>"_" Unterstrich</computeroutput></para>
	     </listitem>
	   </itemizedlist>
	</para>
	
	<para>
	   Im Beispiel verwenden wir den Namen <command>ws001_lp</command>. 
	   Damit ist klar, dass dieser Drucker an der Workstation
	   <command>ws001</command> betrieben wird.
	</para>
	
        <figure>
           <title>printconf-gui Detail Info</title>
           <GRAPHIC FILEREF="pics/printconf_gui_detail_de.jpg"
                    FORMAT="JPG"
                    SRCCREDIT="Martin Newiger, 2005" >
        </figure>
	
	<para>
	   Zwei Felder sind auszufüllen:
	   <orderedlist>
	     <listitem>
	       <para>
	          Die IP-Adresse oder der Name der Workstation, an die der 
		  Drucker angeschlossen ist.
	       </para>
	     </listitem>
	     <listitem>
	       <para>
	          Der TCP-Port des <command>lp_server</command>-Daemons.
	       </para>
	       <para>
	          Für den ersten Drucker, der mit der Workstation verbunden ist, 
		  ist das TCP/IP-Port <command>9100</command>, für weitere sind 
		  es die Ports <command>9101</command> und 
		  <command>9102</command>.
	       </para>
	     </listitem>
	   </orderedlist>
	</para>
	
	<para>
	   Nachdem diese Eingaben getätigt wurden, kann im nächsten Fenster,
	   das Sie durch einen Klick auf '<command>Vor</command>' erreichen,
	   der Hersteller und das Modell des Druckers, welcher mit der 
	   Workstation verbunden ist, ausgewählt werden.
	   <figure>
	     <title>Die Druckerauswahl im printconf-gui-Programm</title>
             <GRAPHIC FILEREF="pics/printconf_gui_choose_printer_de.jpg"
                      FORMAT="JPG"
                      SRCCREDIT="Martin Newiger, 2005" >
           </figure>
	</para>
    </sect1>
</chapter>


<chapter>
  <title>Screen-Skripte</title>
  <para>
     In der Verson 4.0 wurde LTSP um die sogenannten
     <command>Screen-Skripte</command> ergänzt. Diese Skripte erlauben den
     Start von verschiedenen Sessiontypen.
  </para>
  
  <para>
     Sie können mehrere Screen-Skripte für eine Workstation festlegen und 
     erhalten damit mehrere Sessions. Dies können verschiedene oder gleiche
     Sessionstypen sein. Sie können beispielsweise folgendes angeben:
     <programlisting>
   SCREEN_01 = startx
   SCREEN_02 = shell</programlisting>
      Auf dem ersten Screen würde hierbei ein X-Server und auf dem zweiten eine
      Shell-Eingabeaufforderung gestartet. Sie können durch Drücken der
      Tastenkombination Strg-Alt-F1 auf den ersten Screen wechseln. Wenn Sie
      Strg-Alt-F2 drücken, gelangen Sie auf den zweiten Screen.
   </para>
   
   <para>
      Sie können bis zu 12 Screen-Skripte für eine Workstation definieren. Den
      meisten Leuten reicht allerdings ein einziges.
   </para>
   
   <para>
      Es gibt folgende Arten von Screen-Skripten:
      <variablelist>
        <varlistentry>
	  <term><command>startx</command></term>
	  <listitem>
	    <para>
	       Dieses Skript startet den X-Server mit der Option "-query", um 
	       eine Anfrage an den Display-Manager zu senden, damit dieser dann
	       eine Login-Dialogbox auf dem Bildschirm der Workstation 
	       darstellt.
	    </para>
	  </listitem>
	</varlistentry>
	
	<varlistentry>
	  <term><command>shell</command></term>
	  <listitem>
	    <para>
	       Dieses Skript startet eine Shell auf dem Terminal. Die ist zur
	       Fehlersuche auf der Workstation gedacht. Da es sich um eine
	       Session auf dem Thin Client und nicht auf dem Server handelt, ist
	       sie nicht sehr nützlich, um Anwendungen zu starten.
	    </para>
	  </listitem>
	</varlistentry>
	
	<varlistentry>
	  <term><command>telnet</command></term>
	  <listitem>
	    <para>
	       Dieses Skript startet eine Telnet-Session mit dem Server. Hiermit
	       erhalten Sie eine textbasierte Session auf dem Server.
	    </para>
	    <para>
	       In der Default-Einstellung verbindet sich telnet mit dem 
	       LTSP-Server. Wollen Sie einen anderen Server angeben, müssen Sie
	       ihn zusammen mit dem Screen-Skript in der gleichen Zeile
	       angeben. Dies sieht beispielsweise folgendermaßen aus:
	       <programlisting>
    SCREEN_01 = telnet server2.mydomain.com</programlisting>
    	       Sie können auch Optionen, welche von telnet verstanden werden,
	       angeben. Allerdings müssen Sie dann auch den Server, mit dem
	       Sie sich verbinden wollen, mit angeben.
	    </para>
	  </listitem>
	</varlistentry>
	
	<varlistentry>
	  <term><command>rdesktop</command></term>
	  <listitem>
	    <para>
	       Dieses Skript startet ein rdesktop-Programm, mit dessen Hilfe Sie
	       eine Verbindung zu einem Microsoft-Windows-Server herstellen
	       können. Sie können jede von Ihnen gewünschte rdesktop-Option
	       direkt nach der Bezeichnung des Screen-Skripts angeben. Wenn Sie
	       z.B. eine Verbindung zu einem Server herstellen wollen, können
	       Sie dies auf folgende Weise machen:
	       <programlisting>
    SCREEN_01 = rdesktop -f w2k.mydomain.com</programlisting>
    	       Im obigen Beispiel startet rdesktop im Vollbildmodus. Der
	       Benutzer erhält einen Windows-Login-Dialog und muss sich nur
	       einmal einloggen. Dies ist sehr nützlich, wenn man sofort ein
	       Windows-Login ohne ein Linux-Login oder einen Fenstermanager
	       bekommt. Der Benutzer weiß gar nicht, dass Linux ausgeführt wird.
	    </para>
	  </listitem>
	</varlistentry>
      </variablelist>

   </para>
   
   <para>
      Die Screen-Skripte liegen im Verzeichnis
      <filename class="directory">/opt/ltsp/i386/etc/screen.d</filename>. Sie
      können auch eigene Screen-Skripte erstellen und diese dann in jenem
      Verzeichnis ablegen. Wenn Sie ein eigenes Screen-Skript erstellen, ist
      es sehr ratsam, sich dabei an den bestehenden zu orientieren.
   </para>
   
</chapter>


<chapter>
  <title>Fehlersuche</title>
  <para>
     Für den Fall, dass die Workstation nicht bootet oder sonst etwas falsch 
     läuft, sind 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 obige 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 auf die Diskette
       geschrieben wurde.
    </para>
    
    <para>
       Bei einer Meldung wie der folgenden kann man vermuten, dass das von Ihnen
       erstellte Etherboot-Image nicht zu Ihrer Netzwerkkarte paßt.
       <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>DHCP-Fehlerursache</title>
    <para>
       Sobald die Netzwerkkarte initialisiert wurde, schickt sie eine 
       DHCP-Anfrage per Broadcast ins lokale Netz, um einen DHCP-Server zu 
       finden.
    </para>
    
    <para>
       Wenn die Workstation eine gültige Antwort erhält, dann konfiguriert sie
       die Netzwerkkarte. Wenn die IP-Adresse auf dem Monitor angezeigt wird,
       hat alles korrekt funktioniert. Hier ist ein Beispiel, wie es in etwa
       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 ('Me:' gefolgt von einer 
       IP-Adresse), dann arbeitet DHCP korrekt und der Fehler muss woanders 
       liegen. Als nächstes sollte also überprüft werden, ob TFTP läuft.
    </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>
       Es kann schwierig sein, die Fehlerursache herauszufinden. Im folgenden
       Abschnitt finden Sie hierzu ein paar Hinweise:
    </para>
    
    <sect2>
      <title>Überprüfen der Verbindungen</title>
      <para>
         Ist die Workstation physikalisch richtig an dasselbe Netz wie der 
	 Server angeschlossen?
      </para>
      
      <para>
         Kontrollieren Sie nach dem Einschalten der Workstation, ob die 
	 'link'-LEDs der Netzwerkkarte überall aufleuchten.
      </para>
      
      <para>
         Bei einer Direktverbindung zwischen Server und Workstation muss ein 
	 Cross-Over-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 einen 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>
         Allein die Tatsache, dass auf Port 67 ein Prozess auf Anfragen wartet, 
	 heißt noch nicht, dass dies <command>dhcpd</command> ist, es könnte 
	 auch <command>bootpd</command> sein. Dies ist allerdings 
	 unwahrscheinlich, da <command>bootpd</command> in den meisten
	 Distributionen nicht mehr enthalten ist.
      </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 gibt an: <command>dhcpd</command> läuft. Die zweite
	 Zeile zeigt lediglich unser <command>grep</command>-Kommando.
      </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.
      </para>
      
      <para>
         Sie können auch versuchen, den Prozess erst einmal von Hand zu starten. 
	 Das Kommando bei Fedora (Redhat) ist:
	 <programlisting>
service dhcpd start</programlisting>
	 Achten Sie auf eventuelle Fehlermeldungen.
      </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 in etwa eine Ausgabe wie die folgende 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 in etwa eine Ausgabe wie die folgende sehen, dann liegt es 
	   nicht an itables:
           <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 die Workstation die Anfrage?</title>
      <para>
         Beobachten Sie auf dem Server die Datei 
	 <filename>/var/log/messages</filename>, während die Workstation bootet. 
	 Das geht mit dem folgenden Kommando:
         <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 wie oben Meldung besagt, das <command>dhcpd</command> 
	 läuft, aber nichts über die anfragende Maschine weiß.
      </para>
    </sect2>
  </sect1>
  
  <sect1>
    <title>Fehlersuche bei TFTP</title>
    <para>
       Etherboot benutzt TFTP, um den Linux-Kernel vom Server zu laden. Es 
       handelt sich zwar um ein ziemlich einfaches Protokoll, aber es macht 
       manchmal Probleme.
    </para>
    
    <para>
       Wenn Sie auf der Workstation beim Startprozess in etwa folgendes sehen:
    <screen>
Loading 192.168.0.254:/lts/vmlinuz-2.4.24-ltsp-4......... </screen>
       und sich der Bildschirm dabei schnell mit Punkten füllt, zeigt dies an, 
       dass der Kernel geladen wird. TFTP sollte damit richtig laufen.
    </para>
    
    <para>
       Füllt sich der Bildschirm nicht mit Punkten, weist dies auf ein
       Problem hin. Möglicherweise läuft das falsch, was im nächsten Abschnitt
       beschrieben wird.
    </para>
    
    <sect2>
      <title><command>tftpd</command> läuft nicht</title>
      <para>
         Wenn <command>tftpd</command> nicht so eingerichtet ist, dass er
	 automatisch startet, dann kann er sicherlich keine Anfragen der
	 Workstation entgegen nehmen und diese beantworten. Sie könnten das
	 Programm <command>netstat</command> verwenden, um zu sehen, ob
	 <command>tftpd</command> überhaupt ausgeführt wird. Dazu müssen Sie
	 folgendes eingeben und erhalten dann in etwa diese Ausgabe:
	 <programlisting>
[root@bigdog]# netstat -anp | grep ":69 "

udp     0   0 0.0.0.0:69         0.0.0.0:*                 453/inetd        
         </programlisting>
	 Sehen Sie keine Ausgabe, nachdem Sie das Kommando ausgeführt haben, ist
	 es wahrscheinlich, dass tftpd nicht läuft.
      </para>
     
      <para>
         Es gibt für gewöhnlich zwei Methoden, um tftpd zu starten. Diese sind:
	 <command>inetd</command> und das neuere <command>xinetd</command>.
      </para>
     
      <para>
         <command>inetd</command> benutzt eine Konfigurationsdatei, die
	 <filename>/etc/inetd.conf</filename> genannt wird. Stellen Sie sicher,
	 dass die zum Start von tftpd erforderliche Zeile nicht auskommentiert 
	 ist. In etwa sollte diese folgendermaßen aussehen:
	 <programlisting>
tftp dgram udp wait nobody /usr/sbin/tcpd  /usr/sbin/in.tftpd -s /tftpboot
         </programlisting>
      </para>
     
      <para>
         <command>xinetd</command> verwendet ein Verzeichnis mit darin 
	 enthaltenen individuellen Konfigurationsdateien. Jeder Dienst besitzt
	 seine eigene Datei. Nutzt Ihr Server xinetd, heißt die 
	 Konfigurationsdatei für tftpd <filename>/etc/xinetd.d/tftp</filename>.
	 Unten finden Sie ein Beispiel dafür, wie diese Datei aussehen kann:
	 <programlisting>
service tftp
{
  disable          = no
  socket_type      = dgram
  protocol         = udp
  wait             = yes
  user             = root
  server           = /usr/sbin/in.tftpd
  server_args      = -s /tftpboot
}
         </programlisting>
	 Stellen Sie sicher, dass in der <command>disable</command>-Zeile nicht
	 <command>yes</command> eingetragen ist.
      </para>
    </sect2>
    
    <sect2>
      <title>Der Kernel befindet sich nicht an der von tftpd erwarteten 
      Position</title>
      <para>
         Der Kernel muss an einer Stelle liegen, auf die der tftpd-Daemon 
	 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 sich im Verzeichnis
	 <filename>/tftpboot/lts/vmlinuz-2.4.24-ltsp-4</filename> befinden, wenn
	 der <command>filename</command>-Eintrag in der Datei 
	 <filename>/etc/dhcpd.conf</filename> auf 
	 <filename>/lts/vmlinuz-2.4.24-ltsp-4</filename> lautet.
      </para>
    </sect2>
  </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 Verzeichnis 
	 <filename>/opt/ltsp/i386</filename> 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 bigdog rpc.mountd: refused mount request from ws004
                  for /opt/ltsp/i386 (/): no export entry </screen>
          bestätigt z.B. den Verdacht, dass der Eintrag in
	  <filename>/etc/exports</filename> fehlt.
      </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 folgenden 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 in etwa 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. Sie starten
	    den Portmapper per Hand auf folgende Weise:
            <screen>
/etc/rc.d/init.d/portmap   start </screen>
	    Falls so der Portmapper gestartet werden kann, dann sollten Sie nun 
	    einstellen, dass er beim Hochfahren des Servers automatisch 
	    gestartet wird. Unter Redhat (Fedora) benutzen Sie dazu das Kommando
	    <command>ntsysv</command>.
	</para>
      </sect3>
      
      <sect3>
        <title>Die Prozesse NFS und MOUNT (nfsd &amp mountd)</title>
	<para>
	   Für NFS müssen zwei Daemon-Prozesse laufen: <command>nfsd</command>
	   und <command>mountd</command>. Beide werden durch das Skript 
	   <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 Daemons 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 sollten Sie folgende 
	   Kommandosequenz aufrufen:
           <screen>
/etc/rc.d/init.d/nfs  stop
/etc/rc.d/init.d/nfs  start </screen>
           Vielleicht gibt es Fehlermeldungen beim 
	   <command>stop</command>-Kommando, aber dies ist normal. 
	   Das <command>start</command>-Kommando sollte allerdings 
	   <command>OK</command> als Status zurückgeben.
        </para>
	
	<para>
	   Wenn die Prozesse laufen, NFS aber immer noch nicht funktioniert, 
	   dann kann mit dem Kommando <command>rpcinfo</command> feststellen, ob
	   sie sich auch beim Portmapper angemeldet haben.
	   <screen>
rpcinfo -p localhost </screen>
           Sie sollten in etwa folgendes sehen:
           <screen>
program vers proto   port
 100000    2   tcp    111  portmapper
 100000    2   udp    111  portmapper
 100003    2   udp   2049  nfs
 100003    3   udp   2049  nfs
 100021    1   udp  32771  nlockmgr
 100021    3   udp  32771  nlockmgr
 100021    4   udp  32771  nlockmgr
 100005    1   udp    648  mountd
 100005    1   tcp    651  mountd
 100005    2   udp    648  mountd
 100005    2   tcp    651  mountd
 100005    3   udp    648  mountd
 100005    3   tcp    651  mountd
 100024    1   udp    750  status
 100024    1   tcp    753  status</screen>
           Hier wird angezeigt, dass <command>nfs</command> (nfsd) und
	   <command>mountd</command> laufen und sich beim Portmapper registriert
	   haben.
        </para>
      </sect3>
    </sect2>
  </sect1>
  
  <sect1>
    <title>Fehlersuche beim X-Server</title>
    <para>
       Teufel auch! Die schwierigste Einzelaufgabe ist wahrscheinlich das 
       richtige Konfigurieren des X-Servers einer LTSP-Workstation. Bei halbwegs
       neuer, von Xorg X-Servern 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 merkwürdig aus.
    </para>
    
    <para>
       Ist die Workstation zum Start des X-Servers bereit, ruft sie das Skript
       <filename>startx</filename> auf, das den X-Server mit der
       <command>-query</command>-Option, die auf den Server verweist, auf dem 
       ein Display-Manager wie <command>XDM</command>, <command>GDM</command>
       oder <command>KDM</command> läuft, startet.
    </para>
    
    <para>
       Da der X-Server durch das Skript <filename>startx</filename> gestartet
       wird, welches selbst durch das <command>init</command>-Skript aufgerufen
       wird, versucht <command>init</command> bei nicht erfolgreichem Start des
       X-Servers, es wieder auszuführen. <command>init</command> versucht dies 
       zehn mal, bevor es aufgibt ("respawning too fast"). Danach wird eine 
       Fehlermeldung des X-Servers auf dem Monitor zu finden sein.
    </para>
    
    <para>
       Es kann ziemlich irritierend sein, wenn man zehn mal sieht, wie der 
       X-Server nicht gestartet werden kann. Ein einfacher Weg, um diese sich
       wiederholdenden Fehlversuche zu vermeiden, ist das Starten der 
       Workstation 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 mit dem folgenden
       Kommando gestartet werden:
       <screen>
sh  /tmp/start_ws </screen>
       Statt nach zehn Versuchen gibt der X-Server nun nach einem auf und die 
       Fehlermeldungen lassen sich bequem nachlesen.
    </para>
  </sect1>
  
  
  <sect1>
    <title>Fehlersuche beim 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 der 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 genutzten 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 dafür sind:
	 <orderedlist>
	   <listitem>
	     <para>
	        Auf dem angesprochenen Rechner läuft kein Display-Manager
             </para>
	     <para>
	        Neuere Versionen von Redhat (7.0 und höher; auch Fedora), 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 etwa
		so aussieht:
                <screen>
x:5:respawn:/etc/X11/prefdm -nodaemon </screen>
                Das <command>prefdm</command>-Skript 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-Skript, ob KDE installiert ist. Im zutreffenden Fall wird
		KDM als Display-Manager voreingestellt. Ist KDE ebenfalls nicht
		installiert, dann wird XDM 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>
	        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
		192.168.0.254 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 (XDMCP-Anfragen von entfernten
		Rechnern werden abgewiesen). Sie müssen die
		Konfigurationsdateien des laufenden Display-Managers überprüfen,
		um festzustellen, dass er korrekt konfiguriert wurde.
	     </para>
	     
	     <itemizedlist>
	       <listitem>
	         <para><command>XDM</command></para>
		 <para>
		    Bei Redhat (Fedora) ist voreingestellt, dass Anfragen von
		    anderen Rechnern abgelehnt werden. Das weit oben erwähnte
		    Skript <command>ltspcfg</command> sollte eigentlich die
		    notwendige Änderung an den Konfigurationsdateien vorgenommen
		    haben. Falls dies nicht funktioniert hat, sollten Sie sich
		    einmal die Datei 
		    <filename>/etc/X11/xdm/xdm-config</filename> ansehen. Suchen
		    Sie nach einem Eintrag, der etwa so aussieht:
	            <screen>
DisplayManager.requestPort:     0 </screen>
		    Diese Zeile muss unbedingt auskommentiert werden, damit 
		    XDM Anfragen anderer Rechner über Port 177 entgegen nehmen
		    kann.
                 </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 
		   (Fedora) ist sie allerdings auskommentiert. 
		   Bei Problemen sehen Sie 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; bei Fedora Core 4 z.B. unter
		   <filename>/etc/X11/xdm/kdmrc</filename>. 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>
	       </listitem>
	       <listitem>
	         <para><command>GDM</command></para>
		 <para>
		    GDM benutzt andere Konfigurationsdateien. Diese befinden
		    sich im Verzeichnis 
		    <filename role="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 XDMCP-Zugangskontrolle.
		 </para>
	       </listitem>
             </itemizedlist>
           </listitem>
	   <listitem>
	     <para>
	        Wenn feststeht, dass der Display-Manager läuft und auch so
		konfiguriert ist, dass Anfragen entfernter Rechner akzeptiert
		werden, dann kann die Fehlerursache noch folgende sein: Die
		Zuordnung von IP-Adressen zu Rechnernamen stimmt nicht. Der Name
		der Workstation muss entweder in der Datei 
		<filename>/etc/hosts</filename> enthalten sein oder einen
		gültigen Eintrag in den Nameserver-Tabellen besitzen.
	     </para>
	   </listitem>
         </orderedlist>
      </para>
    </sect2>
  </sect1>
</chapter>


<chapter>
  <title>Kernel</title>
  <para>
     Es müssen einige Entscheidungen über einen Kernel, der auf der Workstation
     laufen soll, getroffen werden. Man kann einen der vorbereiteten Kernel
     benutzen, die per Download verfügbar sind, oder man kann 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.
  </para>
  
  <sect1>
    <title>Von LTSP gelieferte Standard-Kernel</title>
    <para>
       Das Kernel-Paket von LTSP enthält zwei 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 zwei 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 sein 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 es, 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 die
       Workstation 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-Bibliothek und
       "busybox" für die Tools, welche wir während des Bootvorgangs benötigen,
       verwendet.
    </para>
    
    <para>
       Wenn Sie eigene Kernel kompilieren wollen, sollten Sie das Paket 
       ltsp_initrd_kit herunterladen. Es beinhaltet das root-Dateisystem und ein
       Skript, 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.
	 Fedora, viele Patches zum Kernel hinzufügen, sodass deren
	 Kernel-Quellen sich vom offiziellen Kernel unterscheiden.
      </para>
      
      <para>
         Laden Sie das gewünschte Kernel-Paket herunter 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 dem Linux Progress Patch (LPP) benötigen,
	 müssen Sie sicherstellen, dass die Patches zur Kernelversion passen.
	 Zum Zeitpunkt der Dokumentationserstllung war 2.4.9 die neueste 
	 Kernel-Version, welche diese Features unterstützte.
      </para>
      
      <para>
         Für unser Beispiel werden wir den Kernel 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>
         Entpacken Sie die Kernel-Quellen in dem Verzeichnis 
	 <filename class="directory">/usr/src</filename>. 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 auspacken.
      </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 geben wir 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 Entpacken 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 der Workstation das Benutzen einer
	   Swap-Datei, welche sich auf einem NFS-Server befindet. Üblicherweise
	   wird empfohlen, genug RAM einzubauen, damit die Workstation 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.
        </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-Skripten 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-Workstations benötigen RAM-Disk-Support. Diese 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 der
		  Workstation läuft. Dies kann man in der Rubrik 
		  'Processor type and features' einstellen. SMP-Support
		  sollten Sie abschalten, es sei denn, ihre Workstation verfügt
		  tatsächlich über mehrere CPUs.
	       </para>
	     </listitem>
	     <listitem>
	       <para>
	          File systems -> Network file systems -> NFS Client support
	       </para>
	       <para>
	          Die Workstation wird ihr 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-Workstations 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 in der Workstation
		  verwendeten Netzwerkkarte passt. Dieser Treiber MUSS fest
		  einkompiliert werden, weil die Ethernet Schnittstelle benötigt
		  wird, bevor das root-Dateisystem gemountet wird. Dies ist ein
		  großer 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>
	          Die Workstation wird ihr 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 class="directory">/usr/src/linux-2.4.9</filename> kopieren.
      </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 usw.
      </para>
      
      <para>
         Nach dem Kompilieren des Kernels befindet sich der neue Kernel im
	 Verzeichnis 
	 <filename class="directory">/usr/src/linux-2.4.9/arch/i386/boot/bzImage</filename>.
      </para>
    </sect2>
    
    <sect2>
      <title>Den Kernel für Etherboot vorbereiten (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 das Kernel-Tagging heißt 
	 '<command>mknbi-linux</command>'.
      </para>
      
      <para>
         Das Paket ltsp_initrd_kit enthält ein Shell-Skript mit dem Namen
	 <command>buildk</command>, welches alle Kommandos enthält, die man
	 benötigt, um den Kernel für das Booten über das Netzwerk vorzubereiten.
      </para>
    </sect2>
  </sect1>
</chapter>


<chapter>
  <title>lts.conf-Einträge</title>
  <para>
     Als wir LTSP entwickelt haben, wussten wir, dass wir mit unterschiedlicher
     Hardware-Ausstattung bei den Workstations rechnen mussten. Egal welche
     Kombination aus Prozessor, Netzwerk- und Grafikkarte wir heute verwenden,
     wir konnten fast sicher sein, dass diese Kombination in drei Monaten, wenn
     wir mehr Workstations hinzufügen wollen, nicht mehr erhältlich sein würde.
  </para>
  
  <para>
     Also haben wir uns einen Weg ausgedacht, wie man die Konfiguration aller
     Workstations zentral speichert. Diese Konfigurationsdatei heißt 
     <filename>lts.conf</filename> und befindet sich im Verzeichnis
     <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 Workstations. Wenn Ihre Workstations
     alle identisch sind, dann genügt es, alle Einstellungen im Abschnitt 
     '[Default]' einzutragen.
  </para>
  
  <sect1>
    <title>Eine ltsp.conf-Beispieldatei</title>
    <para>
      Hier sehen Sie ein Beispiel dafür, wie diese Datei aussehen könnte:
      <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
        SCREEN_01          = startx

[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]
        SCREEN_01          = shell </screen>
    </para>
  </sect1>
  
  <sect1>
    <title>In ltsp.conf verfügbare Parameter</title>
    <sect2>
      <title>Allgemeine Parameter</title>
      <variablelist>
        <varlistentry>
	  <term><command>Kommentare</command></term>
	  <listitem>
	    <para>
	       Kommentare beginnen mit dem '#' Zeichen und gelten bis ans
	       Zeilenende.
	    </para>
	  </listitem>
	</varlistentry>
	<varlistentry>
	  <term><command>LTSP_BASEDIR</command></term>
	  <listitem>
            <para>
	       Damit gibt man das LTSP-root-Dateisystem 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
	       einzelne 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
		 <command>SERVER</command>-Parameter, wie oben beschrieben,
		 verwendet.
	     </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 verwendet.
	    </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 im Netzwerk
	       liegen. Hier können Sie dessen IP-Adresse angeben. Der
	       Defaultwert entspricht dem Wert, der mit 
	       <command>NFS_SERVER</command> 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 die Workstation 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
	       der Wert von <command>SERVER</command> genutzt.
	    </para>
	  </listitem>
	</varlistentry>
	<varlistentry>
	  <term><command>DNS_SERVER</command></term>
	  <listitem>
	    <para>
	       Anhand dieser Angabe wird die Datei
	       <filename>resolv.conf</filename> der Workstation generiert.
	    </para>
	  </listitem>
	</varlistentry>
	<varlistentry>
	  <term><command>SEARCH_DOMAIN</command></term>
	  <listitem>
	    <para>
	       Auch dieser Wert landet in der Datei 
	       <filename>resolv.conf</filename> der Workstation.
	    </para>
	  </listitem>
	</varlistentry>
	<varlistentry>
	  <term><command>SCREEN_01</command> bis <command>SCREEN_12</command></term>
	  <listitem>
	    <para>
	       Bis zu 12 Screen-Skripte können durch diese Einträge geladen
	       werden. Hierdurch erhalten Sie bis zu 12 Sessions auf einer
	       Workstation. Jede kann durch das Drücken der Tasten
	       Strg-Alt-F1 bis Strg-Alt-F12 erreicht werden.
	       <screen>
SCREEN_01   = startx
SCREEN_02   = shell</screen>
            </para>
	    
	    <para>
	       Zurzeit können folgende Werte verwendet werden:
	       <itemizedlist>
		 <listitem><para>startx</para></listitem>
		 <listitem><para>telnet</para></listitem>
		 <listitem><para>rdesktop</para></listitem>
		 <listitem><para>shell</para></listitem>
	       </itemizedlist>
	       Schauen Sie in das Verzeichnis
	       <filename class="directory">/opt/ltsp/i386/etc/screen.d</filename>,
	       um mehr Screen-Skripte zu finden oder Sie legen Ihre eigenen
	       hier ab.
	    </para>
	  </listitem>
	</varlistentry>
	<varlistentry>
	  <term><command>MODULE_01</command> bis <command>MODULE_10</command></term>
	  <listitem>
	    <para>
	       Bis zu zehn Kernel-Module können durch diese Einträge geladen
	       werden. Die Einträge entsprechen dem, was man hinter insmod
	       angeben würde. Beispielsweise:
	       <screen>
MODULE_01   = uart401
MODULE_02   = "sb io=0x220 irq=5 dma=1"
MODULE_03   = opl3 </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 eine Workstation bootet, erzeugt sie eine RAM-Disk und
	       mountet sie nach 
	       <filename class="directory">/tmp</filename>. 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-Skript kann zusätzliche Startskripte ausführen.
	       Legen Sie diese Skripte einfach ins 
	       <filename class="directory">/etc/rc.d</filename>-Verzeichnis und
	       geben Sie hier den Namen ihres Skripts 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 Skript
	       <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 der Workstation
	       verwendet werden soll. Bei PCI- und AGP-Karten sollte dieser
	       Parameter nicht nötig sein. Das rc.local-Skript 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-Grafikkarten oder um einen speziellen Treiber zu wählen,
	       kann man hier den Namen des Treiber-Moduls oder den X-Server
	       angeben.
	    </para>
	    
	    <para>
	       Beginnt der Wert mit <command>XF86_</command>, wird XFree86
	       3.3.6 verwendet, ansonsten X.org 6.7.0. Der Default-Wert 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 drei 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

   or

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 X.org als Pointer Protocol bekannt ist, kann
	       hier verwendet werden. Typische Werte sind z.B. "Microsoft" und 
	       "PS/2". 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>xorg.conf</command>- bzw. 
	       <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>. 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 emulieren, 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
	       X-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
	       Workstations. Die zwei 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-Font-Server benutzt, dann kann man hier seine 
	       IP-Adresse angeben. Wenn diese Variable nicht gesetzt ist, wird
	       der Wert von <command>SERVER</command> genommen.
	    </para>
	  </listitem>
	</varlistentry>
	<varlistentry>
	  <term><command>X_HORZSYNC</command></term>
	  <listitem>
	    <para>
	       Hier kann man den <command>HorizSync</command>-Parameter für
	       X.org 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
	      X.org angeben. Der Defaultwert ist <command>"55-90"</command>.
	    </para>
	  </listitem>
	</varlistentry>
	<varlistentry>
	  <term><command>XF86CONFIG_FILE</command></term>
	  <listitem>
	    <para>
	       Wenn Sie eine eigene komplette Xorg.conf-Datei vorbereitet haben,
	       dann können Sie diese im Verzeichnis
	       <filename class="directory">/opt/ltsp/i386/etc</filename>
	       ablegen. Geben Sie der Datei einen aussagekräftigen Namen, z.B. 
	       xorg.conf.ws004.
               <screen>
XF86CONFIG_FILE = xorg.conf.ws004 </screen>
            </para>
          </listitem>
        </varlistentry>
      </variablelist>
    </sect2>
    
    <sect2>
      <title>Touch-Screen-Parameter</title>
      <variablelist>
        <varlistentry>
	  <term><command>USE_TOUCH</command></term>
	  <listitem>
	    <para>
	       Wenn die Workstation ü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 einer Workstation laufen sollen,
	       stellen Sie diesen Wert auf <command>Y</command>. Diverse weitere
	       Einstellungen müssen am Server vollzogen werden, um 
	       Workstation-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 (Workstation-)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 die
	       Workstation keinen Broadcast senden soll, um einen entsprechenden
	       NIS-Server zufinden.
	    </para>
	  </listitem>
	</varlistentry>
      </variablelist>
    </sect2>
    
    <sect2>
      <title>Tastatur-Parameter</title>
      <para>
         Alle Dateien zur (internationalen) Tastatur-Unterstützung sind im 
	 LTSP-Verzeichnisbaum 
	 (<filename class="directory">/opt/ltsp/i386</filename>) vorhanden.
	 Deshalb ist die Konfiguration der Tastatur nur noch eine Sache von
	 Einträgen in der X.org-Konfiguration. Hier stehen diverse Parameter zur
	 Verfügung.
      </para>
      
      <para>
         Die Bezeichnungen und möglichen Werte der folgenden Parameter stammen
	 aus der Dokumentation von X.org. Alle für X.org 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., eventuell
	       auf us(pc105) setzen.
	    </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., eventuell
	       auf pc105 setzen.
	    </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>
	<varlistentry>
	  <term><command>XkbVariant</command></term>
	  <listitem>
	    <para>
	       Der Defaultwert ist die leere Zeichenkette '<command>nodeadkeys</command>'. 
	       Der Wert könnte für eine deutsche Tastatur auf '<command>nodeadkeys</command>' 
	       gesetzt werden.
	    </para>
	  </listitem>
	</varlistentry>
      </variablelist>
    </sect2>
    
    <sect2>
      <title>Parameter für die Druckerkonfiguration</title>
      <para>
         Maximal drei Drucker können an einer Workstation angeschlossen werden.
	 Eine Kombination aus seriellen und parallelen Druckern kann mit den
	 folgenden Einträgen in der Datei <command>lts.conf</command>
	 konfiguriert werden:
      </para>
      
      <variablelist>
        <varlistentry>
	  <term><command>PRINTER_0_DEVICE</command></term>
	  <listitem>
	    <para>
	       Das Device (Anschluss) des ersten Druckers. Folgende Namen wie
	       <command>/dev/lp0</command>, <command>/dev/ttyS0</command> oder
	       <command>/dev/ttyS1</command> sind erlaubt.
	    </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 der
	       Workstation (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. Der
	       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) oder 
	       '<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>
     <itemizedlist>
       <listitem><para><emphasis role="strong">Hinweis der Übersetzer:</emphasis>
         Dieser Abschnitt trifft in der Gesamtheit nur 
	 für LTSP-Versionen vor 4.0 zu. Insbesondere wird ab Version 4.0 für das
	 Starten lokaler Anwedungen statt <command>rsh</command> das mehr Sicherheit
         bietende <command>ssh</command>-Kommando verwendet. Die Einrichtung ist damit
         allerdings noch aufwendiger geworden. Sehen Sie die folgenden Ausführungen 
         daher eher als Hintergrundinformation an; Sie können im 
	 <ulink url="http://wiki.ltsp.org"><citetitle>LTSP-Wiki</citetitle></ulink>
	 nachlesen, wenn Sie sich über das konkrete Vorgehen beim Ausführen lokaler 
	 Anwendungen informieren möchten. 
         </para>
       </listitem>
     </itemizedlist>
  </para>

  <para>
     In einer LTSP-Umgebung hat man die Wahl, ob die Programme lokal auf der
     Workstation 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 
     auf der Workstation.
  </para>
  
  <para>
     Dies ist eine grundlegende Fähigkeit des X-Window-Systems. Die Workstation
     funktioniert wie ein X-Window-Terminal.
  </para>
  
  <para>
     Wenn eine Anwendung auf der Workstation ausgeführt werden soll, dann
     benötigt die Workstation einige Informationen über den Benutzer:
     <itemizedlist>
       <listitem><para>die Benutzer ID (UID)</para></listitem>
       <listitem><para>die primäre Benutzergruppe (GID)</para></listitem>
       <listitem><para>das Heimatverzeichenis des Benutzers</para></listitem>
     </itemizedlist>
  </para>
  
  <para>
     LTSP benutzt den Network Information Service - NIS (früher auch
     <emphasis role="strong">Yellow Pages genannt</emphasis>), um den
     Workstations diese Informationen zur Verfügung zu stellen.
  </para>
  
  <sect1>
    <title>Vorteile von lokalen Anwendungen</title>
    <para>
      Es gibt einige Vorteile bei der lokalen Ausführung von Anwendungen:
    </para>
    
    <para>
      <itemizedlist>
        <listitem>
	  <para>
	     Reduzierte Server-Last. In großen Netzen mit speicherintensiven
	     Anwendungen, wie z.B. Mozilla, kann es die Performance verbessern,
	     solange die Workstation über genügend 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>
	     Die Soundunterstützung ist viel einfacher zu konfigurieren, wenn
	     die Anwendung, die den Sound erzeugt, lokal auf der Workstation
	     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 
	      Workstation-Hardware. Man benötigt mehr RAM und eine schnellere
	      CPU. Empfehlung: 64MB RAM oder mehr.
	   </para>
	 </listitem>
	 <listitem>
	   <para>
	      NIS - um Anwendungen auf der Workstation auszuführen, muss man
	      sich zuerst gegenüber der Workstation identifizieren. Sie muss
	      wissen, wer Sie sind. Dazu wird eine Art von
	      Passwort-Authentifizierung benötigt. Wir haben NIS gewählt, um
	      eine 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 der Workstation ausgelöst:
		  <orderedlist>
		    <listitem>
		      <para>
		         Das 
		         <filename class="directory">/home</filename>-Verzeichnis
		         des Servers wird per NFS gemountet.
		      </para>
		    </listitem>
		    <listitem>
		      <para>
		         Die Datei <filename>/var/yp/nicknames</filename> wird
			 auf der Workstation angelegt.
		      </para>
		    </listitem>
		    <listitem>
		      <para>
		         Der <command>portmapper</command> wird auf der 
		         Workstation gestartet.
		      </para>
		    </listitem>
		    <listitem>
		      <para>
		         <command>xinetd</command> wird auf der Workstation
		         gestartet.
		      </para>
		    </listitem>
		    <listitem>
		      <para>
		         Die Datei <filename>/etc/yp.conf</filename> wird auf
			 der Workstation 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 Kommando <command>ypbind</command> wird ausgeführt.
		      </para>
		    </listitem>
		  </orderedlist>
               </para>
	     </listitem>
	   </varlistentry>
	   <varlistentry>
	     <term><command>NIS_DOMAIN</command></term>
	     <listitem>
	       <para>
	          Ein NIS-Client versucht entweder eine Verbindung mit einem
		  bestimmten NIS-Server herzustellen, oder er sendet einen
		  Broadcast ins Netz und wartet, dass sich ein Server meldet.
		  Wenn Sie einen NIS-Server angeben wollen, dann tragen Sie
		  seine IP-Adresse in NIS_SERVER 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 Workstations
	 entgegen nimmt. Dieser Prozess heißt <command>ypserv</command>.
      </para>
      
      <para>
         Auf der Workstation gibt es den Prozess <command>ypbind</command>. Wenn
	 die Workstation 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 und 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 der Workstation laufen kann, müssen Sie alle
       Teile der Anwendung dahin kopieren, wo die Workstation Sie auch finden
       kann.
    </para>
    
    <para>
       Bei älteren LTSP-Versionen (2.08 und früher) wurden viele Verzeichnisse
       des Servers per NFS exportiert und von der Workstation gemountet. 
       Verzeichnisse wie z.B. <filename class="directory">/bin</filename>,
       <filename class="directory">/usr/bin</filename>,
       <filename class="directory">/lib</filename> und 
       <filename class="directory">/usr</filename> wurden exportiert.
    </para>
    
    <para>
       Das Problem bei dieser Vorgehensweise ist, dass es nur funktioniert, wenn
       Workstation und Server die gleiche Hardware-Architektur verwenden. Sogar
       der Unterschied zwischen einem Server mit Pentium II (i686) und einer
       Workstation 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>
       Der sauberste Weg ist also, einen kompletten Verzeichnisbaum zu haben,
       der alle Programme und Libraries enthält, den die Workstation benötigt,
       unabhängig von den Programmen und Libraries des Servers.
    </para>
    
    <para>
       Alle Teile, die eine (Workstation-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 class="directory">/opt/ltsp/i386/usr/local/netscape</filename>-Verzeichnis. 
       Darin enthalten sind Java-Klassen, Hilfe-Texte, Programmdateien und 
       Skripte.
    </para>
    
    <para>
       Netscape benötigt keine zusätzlichen System-Libraries, deswegen muss in
       <filename class="directory">/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
       Workstation-lokale Anwendung einrichten. Als Beispiel nehmen wir das
       Programm <command>gaim</command>. gaim 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 gaim Binärdatei finden. Bei Fedora liegt sie im
       <filename class="directory">/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 class="directory">/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 die Workstation schickt, dann wird jede gestartete Anwendung
       ebenfalls auf dem Server laufen und die Ausgaben zur Workstation
       schicken.
    </para>
    
    <para>
       Der Trick bei lokalen Anwendungen besteht darin, dass der Server die
       Workstation anweist, 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 der Workstation
       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-Skript schreiben, welches dann durch Klick
       auf das entsprechende 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 der Workstation können durch einen Eintrag in der
     Datei <filename>lts.conf</filename> festgelegt werden. Diese Datei liegt
     gewöhnlich im Verzeichnis 
     <filename class="directory">/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 zwei 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:
       <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 der
       <filename>lts.conf</filename>-Datei:
       <screen>
MODULE_01           = usb-ohci
MODULE_02           = printer
PRINTER_0_DEVICE    = /dev/usb/lp0
PRINTER_0_TYPE      = S
</screen>
    </para>
  </sect1>
  
  <sect1>
    <title>Die Workstation zum Laden eines XFree86 3.3.6. X-Servers zwinigen</title>
    <para>
       Per Voreinstellung wird X.org 6.7.0 für die Workstation eingerichtet. 
       Für ältere Grafikkarten, die von dieser X-Server-Version nicht mehr
       unterstützt werden, muss zunächst das richtige X-Server-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-Homepage&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-Dokument 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-Homepage&nbsp;&nbsp;
          </para>
          <para>
             <ulink url="http://etherboot.sourceforge.net">
             <citetitle>etherboot.sourceforge.net</citetitle>
             </ulink>
          </para>
          <para></para>
        </listitem>
        <listitem>
          <para>
             Die Rom-O-Matic-Webseite&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>
             X.org-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>
