LinuxNetMag
Plattenloses Linux
Archiv | Home
Inhalt
   
LinuxNetMag #5

  Software
 Aktuell
kurz vorgestellt
SuSE7.0 Testbericht
Mozilla Preview
 Applikationen
Videoschnittsystem
Windows X-Server
Windowmanager
  
 

Hardware

TV-Karte
Wheel-Mouse
Webcam selbstgebaut
LCD-Panel
  
 

Netzwerk

Web2Fax-Gateway
Apache mit SSI
Booten übers Netz
Webcam-Streaming
offline Mailingliste
Audio-Streaming
ISDN-Dial-In Server
empfehlenswerte Links
  
 Wissen
Abenteuer ReiserFS
Linux-Devices
LinuxExpo Brasilien
  
 

Sonstiges

Mailing-Liste
Gästebuch
Artikelliste
Unterstützen Sie uns !
zurück zur Hauptseite



Druckversion


  Netzwerk-Booten Einen PC komplett übers Netz zu booten, d.h. einen PC ohne Diskettenlaufwerk oder Festplatte ausrüsten zu müssen, klingt zuerst etwas seltsam, ist aber mit etwas Aufwand durchaus erreichbar.

Einleitung

Nach dem Booten eines PCs versucht normalerweise das Bios eine angeschlossene Festplatte, ein Diskettenlaufwerk oder ein CD-Rom-Laufwerk zu finden, von dem der PC booten kann.
Normalerweise bootet man von einem dieser Speichermedien. Ist keines dieser Hardwarekomponenten vorhanden, kann man eigentlich auch kein Betriebssystem starten.
Aber es geht auch ohne. Sollte der PC mit einer Netzwerkkarte ausgerüstet sein, kann man das Betriebssystem auch per Netz von einem entsprechenden Server herunterladen.

Daraufhin stellt sich einem schnell die Frage, was das nun für Vorteile mit sich bringen sollte?
Bei größeren Netzwerken auf jeden Fall den Vorteil der leichten Administration. Denn die Daten aller PCs liegen versammelt auf einem einzigen Server und sind dem Administrator damit immer zugänglich.
Sollte der Wunsch bestehen, Teile des Systems zu erneuern (z.B. um ein Sicherheitsloch zu stopfen) oder neue Software aufzuspielen, kann dies alles auf dem Server geschehen. Bei entsprechender Konfiguration kann es sogar ausreichen, ein Softwarepaket auf dem Server nur ein einziges Mal zu installieren und es damit allen Rechnern des Netzwerks zur Verfügung zu stellen.
Außerdem ist bei einer derartigen zentralen Verwaltung aller PC-Daten auch das Generieren eines Backups wesentlich einfacher, da die Daten nicht erst von jedem PC übers Netz bezogen werden müssen (wofür dann auch die Client PCs auch noch alle angeschaltet bleiben müssten).
Aber das Einsatzfeld ist wesentlich größer und nicht nur auf große Netzwerke beschränkt.
Der Einsatz eines netzwerkbootenden PCs ist auch ideal für Embedded-Systems (das sind zumeist kleine PC-Systeme, die nicht als Arbeitsplatz-PC dienen, sondern irgendwelche speziellen Aufgaben übernehmen, wie z.B MP3-Player(!) oder zum Steuern von Geräten).

Außerdem kann man mittels Netzwerkbooten aus einem alten PC einen funktionierenden X-Server basteln.
Der Vorteil hierbei ist, daß man auf eine Festplatte gänzlich verzichten kann und bei geeigneter Bauweise auch auf andere bewegliche Teile wie Lüfter. Der so gebaute PC erzeugt damit keinerlei Geräusche und kann somit auch in Wohnbereichen ohne Dauer-Lärmbelästigung eingesetzt werden.

Bevor es aber jetzt an die Konfiguration geht, noch eine kleine

Warnung !
Die in diesem Artikel beschriebene Vorgehensweise greift stark in die Funktionsweise Ihres PCs ein (sowohl auf dessen Software als auch Hardware).
Die Benutzung sämtlicher Programme und Hardwarebauanweisungen erfolgt ausschließlich auf eigenes Risiko. Alle beteiligten Autoren (d.h. Autoren dieses Artikels, verlinkter Artikel als auch der beteiligten Software) können für Schäden, die aus der ordnungsgemäßen oder auch fehlerhaften Benutzung dieser Komponenten (Text, Software, Hardware) entstehen, nicht haftbar gemacht werden.

Als nächstes noch eine Warnung in ganz anderer Hinsicht.
Die Installation eines netzwerkbootenden PCs kann sehr steinig sein, und zumeist funktionieren die beteiligten Komponenten nicht auf Anhieb, sondern erst nach längerem Herumprobieren. Die Dokumentation der beteiligten Software ist meistens schlimmer als ungenügend.
Deshalb sollte man schon etwas Ahnung von Hardware, Software und Netzwerkprotokollen besitzen und auf jeden Fall nicht schnell aufgeben.
Auch wenn ich versuche die Konfigurationsanleitung sehr umfangreich und einfach verständlich zu gestalten, kann ich nicht alle Eventualitäten erwähnen oder gar erahnen.
Für Verbesserungsvorschläge und Hinweise bin ich deshalb immer dankbar.

Hardware

Da das Betriebssystem nicht auf einer Festplatte gespeichert wird, sondern übers Netz geladen wird, muß das Bios über entsprechende Mittel Verfügen, um einen Download des Kernels ausführen zu können.
Die entsprechende Software dafür wird in einem sogenannten Bootrom gespeichert, welches dann auf einem dafür vorgesehenen Sockel auf der Netzwerkkarte plaziert werden muß.
Zwar gibt es vorgefertigte Bootroms bei einigen wenigen Händlern zu kaufen oder direkt beim Netzwerkkarten-Hersteller zu beziehen, allerdings sind diese Bootroms zumeist für Novell-Netzwerke konstruiert und basieren auf IPX statt auf TCP/IP.
Es ist also nicht empfehlenswert ein derartiges vorgebranntes Bootrom zu beziehen.

Das Paket netboot (Homepage unter http://www.han.de/~gero/netboot.html) bietet die entsprechende Software und Treiber, um ein derartiges Bootrom selbst zu erzeugen (dazu später mehr).
Dieses Bootrom kann man nun entweder auf ein leeres Eprom oder EEprom brennen oder auch einfach auf Diskette kopieren.
Da der Kauf eines guten Eprom-Brenners zumeist mit mindestens DM 400,- nicht gerade günstig ist, lohnt sich dieser Schritt zumeist nur, wenn Sie viele Bootroms erzeugen wollen.
Da auch die leeren Bootroms in kleinen Mengen zumeist über DM 15,- kosten, sollte man erwägen, sich für die Lösung mit einer Boot-Diskette zu entscheiden. Denn das Bootrom kann auch auf eine Diskette kopiert werden, um den Programmcode dann von dort aus auszuführen.
Da ein Diskettenlaufwerk mittlerweile nur um die DM 20,- kostet und somit nur unwesentlich teuerer als ein Bootrom ist (solange man schon im Besitz eines Eprom-Brenners ist, ansonsten kommt diese Investition noch hinzu), sollte man sich eher für diese Lösung entscheiden.
Das Diskettenlaufwerk sollte dann aber unbedingt im Inneren des Gehäuses und unerreichbar für den PC-Benutzer angebracht werden, so daß er das Laufwerk nicht erreichen kann.
Das Diskettenlaufwerk wird nur ein einziges mal während des Bootvorgangs benutzt und beeinflußt somit die Geschwindigkeit des später laufenden Systems nicht.

Bootrom

Um nun das Bootrom zu erzeugen, sollten Sie sich die neueste Version von netboot vom Server http://www.han.de/~gero/netboot.html herunterladen. (aktuelle stabile Version ist 0.8.1).
Das Entpacken erfolgt mittels

>> tar zxvf netboot-0.8.1.tar.gz -C /tmp/
Wechseln Sie in das erzeugte Verzeichnis und starten Sie die Konfiguration
cd /tmp/netboot
./configure 
make
make install
Dabei kann es durchaus passieren, daß das Kompilieren des Pakets mit einer Fehlermeldung abbricht (so zumindest auf unseren Systemen).
Dies ist weniger tragisch, da nur Komponenten nicht kompiliert werden können, die wir nicht benötigen.
(Sollte auch bei Ihnen der Befehl make mit einer Fehlermeldung abbrechen, gehen Sie in das Verzeichnis makerom um dort den Befehl make auszuführen, gleiches im Verzeichnis mknbi-linux und bootrom. Führen Sie danach den Befehl make install aus).

Als nächstes erzeugen wir ein Bootrom. Dafür benötigen Sie vorher noch einige Informationen über Ihre Netzwerkkarte.

Kartentyp:
Bei den billigen Netzwerkkarten handelt es sich zuemist um eine NE2000-kompatible Karte

Interrupt/IO-Adresse/MAC-Adresse:
Bei Non-Plug&Play-Karten können Sie den Interrupt per Jumper auswählen. Bei Plug&Play-Karten wird der Interrupt automatisch gewählt. Falls Sie die Interrupt-Nummer nicht kennen, kann diese häufig mit den der Karte beiligenden Softwaretools erfragt werden (Die dazugehörige Software läuft i.A. nur unter DOS).
Falls die Karte in einem bereits laufendnen Linux-System eingebaut ist, erfahren Sie die Interruptnummer während des Bootvorgangs. Der Befehl

cat /var/log/dmesg
zeigt Ihnen nochmal die Bootmeldungen. Dort suchen Sie nach einem Eintrag der folgenden Form:
eth0: RealTek RTL-8029 found at 0x7400, IRQ 5, 00:E0:7D:82:5F:B6
Dort finden Sie die IRQ-Nummer (hier 5) und die IO-Adresse (hier 0x740 -- ohne die letzte Null). Außerdem sollten Sie sich die letzten 6 Buchstaben- und Zahlenkombination (die sog. MAC-Adresse) notieren.
Hierbei handelt es sich um eine weltweit eindeutige Nummer, die Ihre Netzwerkkarte eindeutig identifiziert.
Sollte die Karte nicht fest im Kernel kompiliert sein, sondern nur als Modul, müssen Sie das Modul laden (insmod eth0 oder bei automatischem Laden der Module ein Ping starten) und dann mittels cat /proc/ioports und cat /proc/interrupts den Eintrag Ihrer Netzwerkkarte suchen.

Haben Sie nun alle diese Daten notiert, können wir mit dem Generieren des Bootroms beginnen:
Im Unterverzeichnis /tmp/netboot/makerom startet man das Programm

>> ./makerom
Wir erhalten daraufhin folgende Ausgabe:
Bootrom configuration program, Version 0.8.1 (netboot)
Copyright (C) 1995-1998 G. Kuhlmann

The following 3 kernels are available:
(1)	kernel.bin
(2)	kernelm.bin
(3)	kernel86.bin
Select the kernel you wish to use [1]: 

Hier wählt man den im Bootrom zu installierenden Kernel. Wir benötigen nur einen minimalen Kernel, deshalb wählen wir die 2.

Auf die folgende Frage

Do you want the bootrom to look for boot drives (y/n) [no] ? 
sollte man mit no antworten, wenn der spätere PC immer übers Netz booten soll und keine bootfähigen Laufwerke besitzt.

Im nächsten Schritt wird der zu installierende Netzwerktreiber abgefragt:

The following 10 network drivers are available:
(0)	user defined network driver
(1)	3c501.com
(2)	3c503.com
(3)	3c509.com
(4)	arcether.com
(5)	dc21x4.com
(6)	e100bpkt.com
(7)	ne1000.com
(8)	ne2000.com
(9)	ne2100.com
(10)	smc_wd.com
Select the network driver you wish to use [0]: 
Wer im Besitz einer NE2000-Karte ist, sollte hier die 8 wählen. (Falls Sie später Probleme mit den Treibern haben sollten, z.B. wenn Ihre Karte nicht erkannt wird, ist es empfehlenswert, die neuesten Treiber von der CRYNWR-Treiber-Sammlung zu beziehen. Wählen Sie in einem solchen Falle die 0 und geben Sie den absoluten Pfad zu den heruntergeladenen Treibern an.)
Jeder Treiber benötigt die Angabe des Interrupt und IO-Adresse und der Paket-Interrupt-Nummer. (Treiber anderer Karten - d.h. nicht NE2000 - können noch weitere Angaben benötigen.)
Die Reihenfolge der Angaben ist <packet_int_no> <int_level> <io_addr> also in unserem Beispiel
Enter command line arguments for network driver: 0x62 5 0x740
Die Angabe der Paket-Interrupt-Nummer wird nur intern von Bootrom benötigt und sollte meistens frei wählbar zwischen den Werten 0x60 bis 0x66, 0x68 bis 0x6f und 0x78 bis 0x7e sein.
Die Meinungen, welcher Wert geeignet ist, sind unterschiedlich. Versuchen Sie ruhig einen niedrigen Wert und einen hohen Wert aus, falls der Treiber nicht auf Anhieb funktionieren sollte.
Bei Plug&Play-Karten kann es vorkommen, daß automatisch eine hohe IO-Adresse ausgewählt wird. Dies kann aber zu Problemen bei den netboot-Treibern führen.
Karten mit Jumper-Einstellungen sind deshalb vorzuziehen, da man dann die volle Kontrolle über die gewählten Ressourcen hat, und nicht auf die zumeist unglückliche Wahl der Plug&Play-Treiber angewiesen ist.

Die folgenden drei Fragen können getrost mit no beantwortet werden

Do you want to use the ANSI display driver (y/n) [yes] ? no
Do you want to use the packet driver debugger (y/n) [no] ? no
Do you want to specify an additional program (y/n) [no] ? no
Als nächstes wird gefragt, in welchem Format das Bootrom abgespeichert werden soll. Dies ist abhängig davon, welchen Code Ihr Eprom-Brenner versteht, oder was für einen Typ von Chip Sie brennen wollen.
Die Disketten-Treiber werden bei jeglicher Wahl auch erzeugt.
Available output file types (floppy image gets always created):
(1)	Raw binary
(2)	Image for programming a FlashCard across the network
(3)	Intel hex
(4)	Motorola hex
(5)	Tektronix hex
Select the format you wish to use [1]: 
Damit wär dieser Schritt erstmal geschafft. In dem Verzeichnis makerom befinden sich nun die Dateien image.flo für die Boot-Diskette und eine weitere Datei Image.???, wobei die Endung davon abhängig ist, welchen Output-Typ Sie im letzten Schritt gewählt haben.

Um nun die Boot-Diskette zu erzeugen, legen Sie eine leere Diskette in Ihr Floppy-Laufwerk (Diskette nicht mounten!) und führen den Befehl

>> dd if=image.flo of=/def/fd0
Somit wäre das Bootrom auf der Diskette.

Server-Konfiguration

In diesem Abschnitt geht es darum, wie der Server zu konfiguieren ist, von dem der netzbootende PC seinen Kernel und u.U. das Dateisystem erhält.
Es gibt viele verschiedene Verfahren, um einen PC übers Netz zu booten.
Zwei veraltete Methoden sind RARP und BOOTP.
Wesentlich flexibler im Einsatz und auch fürs Booten übers Netz einsetzbar ist das Programmpaket DHCP, welches bei gängigen Distributionen mitinstalliert sein sollte (notfalls nachinstallieren).
Da der Installationsaufwand der einzelnen Verfahren ungefähr vergleichbar ist, sollte man DHCP verwenden.
Wie man den DHCP-Server installiert, ist abhängig von der benutzen Distribution. Bei SuSE genügt es mittels Yast die Konfiguration dahingehend zu ändern, daß die Variable

START_DHCPD="yes
den Wert yes und unter
DHCPD_INTERFACE="eth0"
Ihr Netzwerkdevice eingetragen ist.
Die Variable
START_DHCRELAY="no"
sollte i.A. auf no eingestellt sein, außer Sie wissen ganz genau, was Sie damit bewirken.

Bei anderen Distributionen erfolgt die Installation des DHCP-Server anders, z.B. durch Verlinken des DHCP-Init-Skripts in dem jeweiligen Run-Level. Lesen Sie notfalls in der Dokumentation Ihrer Distribution nach.

Die Konfigurationsdatei des DHCP-Servers liegt unter /etc/dhcpd.conf und sollte etwa folgendermaßen aussehen

Datei /etc/dhcpd.conf
       server-identifier server.netmag.de;
       option subnet-mask              255.255.255.0;
       option routers                   192.168.0.1;
       option domain-name-servers      192.168.0.1;
       option domain-name              "netmag.de";

       use-host-decl-names on;

       shared-network WORKSTATIONS {
               subnet 192.168.0.0 netmask 255.255.255.0 {
               }
       }
       group   {
               use-host-decl-names             on;

               host pc1 {
                       hardware ethernet       00:80:C8:D9:31:C1;
                       #                       ---MAC-Adresse
                       fixed-address           192.168.0.10;
                       #                       ---zuzuweisende IP-Nummer
                       filename                "pc1/bootImage";
                       #	               ---Wo der zu ladenden Kernel
                       #                          liegt (spaeter mehr)
               }
               host pc2 {
                       hardware ethernet       00:E3:7F:86:3F:B9;
                       fixed-address           192.168.0.119;
                       filename                "pc2/bootImage";
               }
	}

Nach dem Neustart des DHCP-Servers (unter SuSE z.B.)

>> /sbin/init.d/dhcp restart
sollte die neue Konfgurationsdatei eingelesen werden
Shutting down service dhcpd                                       done
Starting service dhcpd                                            done
unter RedHat-basierenden Distributionen liegt das entsprechende DHCP-Skript unter /etc/rc.d/init.d/.

Um zu testen, ob der DHCP-Test auch richtig konfiguriert ist, benutzt man am besten das Programm bootpc welches bei den meisten Distributionen mit installiert wird (Homepage unter http://www.damtp.cam.ac.uk/linux/bootpc/).
Der Aufruf des Programms sendet ein Broadcast im Netzwerk, und wartet darauf daß ein Bootp-fähiger Server (nämlich unser eben konfigurierte DHCP-Server) auf die Anfrage antwortet, und gibt auf dem Prompt die zurückgegebene Antwort aus:

>> bootpc
SERVER='192.168.0.1'
IPADDR='192.168.0.119'
BOOTFILE='pc2/kernel.net'
NETMASK='255.255.255.0'
NETWORK='192.168.0.0'
BROADCAST='192.168.0.255'
GATEWAYS_1='192.168.0.13'
GATEWAYS='192.168.0.13'
DNSSRVS_1='192.168.0.13'
DNSSRVS='192.168.0.13'
HOSTNAME='pc1'
DOMAIN='netmag.de'
SEARCH='netmag.de'
Ohne Angabe von Optionen benutzt bootpc die MAC-Adresse der im PC befindlichen Hardware. Man kann aber mittels der Option --hwaddr auch die Einstellungen für PCs mit anderer MAC-Adresse erfragen.
Zur Fehlersuche eignet sich die Option --verbose.

Wie kommt nun der Kernel während des Bootens vom Server zum Client?
Das funktioniert ungefähr folgendermaßen:
Der bootende Client führt den Code im Bootrom oder der Boot-Diskette aus und schickt einen Broadcast mit seiner MAC-Adresse und der noch ungesetzten IP-Adresse 0.0.0.0 ins Netz und wartet darauf, daß sich ein Server meldet.
Unser DHCP-Server empfängt diese Anfrage und schickt dem Client die Angaben zurück, die wir oben mittels des Befehls bootpc schon gesehen haben.
Der Client liest daraufhin diese Angaben aus, setzt seine IP-Adresse auf den eingestellten Wert, nimmt mit dem angegebenen Server Kontakt auf, und läd mittels des Protokolls TFTP (welches ein einfaches FTP-Protokoll ist) den Kernel aus dem angegebenen Verzeichnis herunter.
Daraufhin wird der Kernel in den Speicher kopiert und ausgeführt. Linux wird gebootet.

Wie man aus diesem kurzen Überblick erkennen kann, müssen wir auf den Server noch das TFTP-Protokoll installieren. Dies ist zumeist nicht aktiviert, da es erhebliche Sicherheitsmängel aufweist, denn es unterstützt (normalerweise) keine Paßwort-Abfrage, und sollte deshalb nur in Netzwerken benutzt werden, bei denen der Port des TFTP-Protokolls von außerhalb nicht erreichbar ist (z.B. geschützt durch eine Firewall).
Das verhindert aber noch nicht, daß jemand im eigenen Netzwerk (also hinter der Firewall sich unberechtigt Zugriff auf Daten verschafft).

Um den TFTP-Server zu aktivieren benötigt man in der Datei /etc/inetd.conf folgenden Eintrag:

Datei /etc/inetd.conf
tftp          dgram   udp     wait    nobody  /usr/sbin/tcpd  in.tftpd /tftpboot

Der letzte Eintrag /tftpboot teilt dem TFTP-Server mit, daß das Verzeichnis /tftpboot auf dem Server als Stamm-Verzeichnis anzusehen ist.
Es ist somit nicht erlaubt, auf die Daten des Servers zuzugreifen, sondern nur auf Daten der Client-Verzeichnisse. Dies bietet zumindest den Server-Dateien etwas Schutz.
(Aus diesem Grund müssen bei der DHCP-Konfiguration auch nur die Verzeichnisse relativ zum /tftpboot-Verzeichnis angegeben werden, da diese das Root-Verzeichnis für den TFTP-Client darstellt.)

Ein Neustarten des inetd-Prozesses (oder notfalls auch ein Neustarten des Servers) bewirkt, daß die Änderungen an der inetd.conf sich auch auswirken.

NFS-Einstellungen

Da die Clients nach dem Booten das gesamte Dateisystem übers Netz beziehen, muß der NFS-Server entsprechend konfiguriert werden, so daß er es diesem PCs auch erlaubt, die benötigten Verzeichnisse zu mounten.
In der Datei /etc/exports benötigt jeder Client einen Eintrag der folgenden Form:

Datei /etc/exports
/tftpboot/pc1   pc1.netmag.de(rw,no_root_squash)
/tftpboot/pc2   pc2.netmag.de(rw,no_root_squash)
/usr		*.netmag.de(ro)

Die Grundverzeichnisse werden mit Schreib- und Leseberechtigung gemountet, das /usr-Verzeichnis nur mit Leseberechtigung.
Die Option no_root_squash bewirkt, daß der root der Clients die Dateien auf dem Server auch mit root-Rechten ablegen kann.
Ohne diesen Eintrag würden alle Dateien, die der root auf dem Client lesen oder schreiben will, mit dem user nobody und der Gruppe nogroup behandelt werden, was schon während des Bootens zu Problemen mit den Rechten führen wird. (Normalerweise erhält man nach dem Booten nicht einmal einen Prompt, um sich auf dem System einzuloggen, da die Datei /var/run/utmp nicht mit den notwendigen Rechten ausgestatten ist.)

Zusätzlich müssen alle Boot-Clients noch mit Ihrem Namen angemeldet werden. Entweder auf dem DNS-Server, falls einer im Netz existiert, oder auf den Rechnern mit einem Eintrag in der Datei /etx/hosts

/etc/hosts
192.168.0.10  pc1.netmag.de  pc1
192.168.0.119 pc2.netmag.de  pc2

Nach dem Neustart des NFS-Daemons (oder notfalls des ganzen Servers) sind auch diese Änderungen aktiviert, und wir können uns ganz der Konfiguration der Clients zuwenden.

Client-Installation

In den nächsten Schritten geht es darum, für den Client einen funktionierenden Kernel und eine bootende Installation zu erstellen.

Zunächst muß man den Kernel kompilieren, der auf dem Client gebootet werden soll.
Auf einem beliebigen Linux-Rechner führen Sie deshalb im Verzeichnis /usr/src/linux den Befehl

>> make xconfig
aus und Konfigurieren einen Kernel so, daß er auf der Hardware des zu bootenden Clients auch läuft. Beachten Sie dabei, daß nur die wirklich notwendigen Komponenten in den Kernel integriert werden und die zum Booten benötigten Treiber alle fest in Kernel integriert werden.
Für jeden Netz-bootenden PC sind folgende Einstellunge überlebenswichtig:

Auswahl der Kernel-Einstellungen
                   Networking support            y
                   TCP/IP networking             y
                   Network device support        y
                   Ethernet (10 or 100Mbit)      y
                   NFS filesystem support        y
                       Root file system on NFS   y
                            BOOTP support        n
                            RARP support         n

BOOTP und RARP sollten deaktiviert werden, da wir stattdessen DHCP benutzen. (Versuchen sie erstmal einen minimalen Kernel zu benutzen, um dann später die benötigten Hardwarekomponenten hinzuzufügen.)

Danach muß der Kernel kompiliert werden

>> make config
>> make dep
>> make clean
>> make zImage
kopieren Sie den erzeugten Kernel arch/i386/boot/zImage ins /tmp/netboot/mknbi-linux-Verzeichnis:
>> cp arch/i386/boot/zImage /tmp/netboot/mknbi-linux/
Denn in den nächsten Schritten muß der Kernel noch etwas nachbearbeitet werden, damit er auch übers Netz gebootet werden kann. Im Verzeichnis /tmp/netboot/mknbi-linux führen wir dann folgenden Befehl aus:
./mknbi-linux/mknbi -d rom -i rom -k zImage -o bootImage
Damit wird aus dem Kernel zImage ein Netzwerkbootender Kernel bootImage gemacht.
Das reicht aber noch nicht ganz aus:

Sollte das Device /dev/nfs noch nicht existieren erstellen wir dieses mit dem Befehl (als root)

mknod /dev/nfs b 0 255 
und geben dem Kernel noch den letzten Schliff:
rdev bootImage /dev/nfs
Somit ist der Kernel für alles vorbereitet.
Als nächstes installieret man auf dem Server das Verzeichnis, aus dem die Clinets später Ihr Dateisystem empfangen. Dafür legt man standardmäßig das Verzeichnis /tftpboot an:
>> mkdir /tftpboot
in dieses Verzeichnis legt man dann die Unterverzeichnisse für die verschiedenen Clients an:
>> mkdir /tftpboot/pc1
>> mkdir /tftpboot/pc2
In diese Verzeichnisse werden dann die bearbeiteten Kernel kopiert
>> cp bootImage /tftpboot/pc1/
>> cp bootImage /tftpboot/pc2/
In diese Unterverzeichnisse wird dann das Dateisystem der Boot-PCs angelegt. Am einfachsten ist es, die Verzeichnisse einer bereits installierten Distribution in diese Verzeichnisse zu kopieren.
Wollen Sie also auf den Clients die selbe Linux-Version wie auf dem Server haben, kopieren Sie die Verzeichnisse (als root):
>> cp -a /bin /tftpboot/pc1/
>> cp -a /sbin /tftpboot/pc1/
>> cp -a /boot /tftpboot/pc1/
>> cp -a /dev /tftpboot/pc1/
>> cp -a /etc /tftpboot/pc1/
>> cp -a /lib /tftpboot/pc1/
>> cp -a /var /tftpboot/pc1/
>> cp -a /bin /tftpboot/pc1/
Außerdem müssen noch folgende Unterverzeichnisse angelegt werden:
>> mkdir /tftpboot/pc1/home
>> mkdir /tftpboot/pc1/proc
>> mkdir /tftpboot/pc1/tmp
(Gleiches muß natürlich auch für die Installation des pc2 ausgeführt werden.)
Falls Sie auf den boot-Clients die selben Benutzer wie auf dem Server einrichten wollen, sollten Sie auch das home-Verzeichnis mittels NFS mounten.

Jegliche weitere Konfiguration der Clients ist stark davon abhängig, was für eine Distribution Sie verwenden.
Auf jeden Fall muß auf allen PCs das Routing eingestellt werden und auch die /etc/fstab angepaßt werden.
Wichtig ist auch das Einstellen des Hostnamen und der IP-Nummer der Rechner (bei SuSE über die Datei /etc/rc.config, da ansonsten beim Mounten der NFS-Verzeichnisse ein Fehler entsteht).

Datei /tftpboot/pc1/etc/fstab
 #
 # /etc/fstab auf firewall
 #
 server:/usr			/usr	nfs	defaults	0  0
 #zum mounten des Home-Verzeichnisses
 #server:/home			/home   nfs	defaults	0  0
 #zum benutzen des CD-Roms des Servers
 server:/mnt/cdrom                /cdrom  nfs     noauto,user     0  0
 #
 proc 			        /proc   proc    defaults        0  0

Datei /tftpboot/pc1/etc/route.conf
 #
 # /etc/route.conf
 #
 # In this file you can configure your static routing...
 #
 # This file is read by /sbin/init.d/route. 
 #
 #
 192.168.0.10            0.0.0.0                 255.255.255.255         eth0
 192.168.1.0             0.0.0.0		       255.255.255.0	       eth0

Und die zu ändernden Bereiche in der RC.conf

Datei /tftpboot/pc1/etc/rc.conf
 .
 .
 #
 # IP Adresses
 #
 IPADDR_0="192.168.0.10"
 .
 .
 # parameteres for ifconfig, if you put "bootp" into it, bootp will
 # be used to configure it
 # sample entry for ethernet:
 # IFCONFIG_0="192.168.81.38 broadcast 192.168.81.63 netmask 255.255.255.224"
 #
 IFCONFIG_0="192.168.0.10 up"
 . 
 .
 #
 FQHOSTNAME="pc1.netmag.de"

Mit diesen Einstellungen sollte der PC wenigstens booten und zum Eingabeprompt kommen. Häufig erhält man beim ersten Booten noch viele Fehlermeldungen. Am besten loggt man sich am Client selbst ein und behebt diese Fehler.
Hat man dann die ideale Konfiguration für die Clients gefunden, kann man das Verzeichnis in /tftpboot beliebig kopieren und auch für andere Clients benutzen.
Natürlich kann man auch mehrere Clients gemeinsam von einem /tftpboot-Unterverzeichnis booten lassen.

Diskless PC
Ein netzbootender PC in einer Pappschachtel. Ohne Festplatte, nur Netzwerkkarte, Soundkarte und VGA-Karte und Diskettenlaufwerk. Keine Lüfter. (Bauweise zur Nachahmung nicht empfohlen)

Probleme

Es sollte einen schon sehr wundern, wenn alles auf Anhieb funktioniert.
Man sollte sich nicht entmutigen lassen, wenn ein Arbeitsschritt nicht sofort die gewünschte Wirkung hat. Zu viele verschiedene Distributionen und Konfigurationen existieren, als daß man die All-Round-Lösung präsentieren könnte.
Häufig liegen die Fehler bei folgenden Punkten:

Ihr System benutzt aus Sicherheitsgründen tcpwrapper.
Da der bootende PC noch keine IP-Adresse besitzt, meldet er sich im Netz zuerst noch mit der Adresse 0.0.0.0. TCP-Wrapper können nun einer derartigen Adresse einen Zugriff auf den bootp- bzw DHCP-Port verweigern.
Um dies zu beheben, benötigen Sie einen Eintrag der folgenden Form in der Datei /etc/hosts.allow auf Ihrem Server:

Date /etc/hosts.allow
ALL:            192.168.0.0/255.255.255.0: ALLOW
bootpd:		0.0.0.0
in.tftpd:	192.168.0.
portmap:	192.168.0.

Sollte die Bootdiskette nicht wie gewünscht funktionieren, liegt dies zumeist an fehlerhaften Einstellungen der Bootrom-Optionen.
Sind Sie sich aber sicher, daß diese Optionen richtig sind, versuchen Sie auch neue Treiber zu benutzen.
Außerdem kann es bei großen IO-Adressen zu Problemen kommen.
Es wurde auch berichtet, daß einige Karten mit bestimmten Packet-Interrupt-Nummern Probleme machen.
Sollte beim Booten statt der korrekten MAC-Adresse nur FF:FF:FF:FF:FF angezeigt werden, wurde Ihre Karte von den Treibern nicht richtig erkannt.

Wird Ihre Karte richtig erkannt, aber die Boot-Daten vom Server nicht empfangen (nur die Informationen von bootpc, noch nicht der Kernel selbst), so kann dies am fehlerhaften Routing auf Seiten des Servers liegen. (Schauen Sie auch in die Datei /var/log/messages für einen Eintrag der Form Network not reachable)
Fügen Sie die Zeile

default 	192.168.0.1
Ihrer Routing-Tabelle hinzu, wobei hier die IP-Adresse des Gateways (zumeist die Server-IP selbst) benutzt wird.

Bekommt der Client die Bootp-Daten vom Server, kann aber den Kernel nicht herunterladen, liegt dies zumeist an einer falschen Konfiguration der Pfadangabe in der /etc/dhcp.conf.
Dieser Fehler kann aber auch bei fehlerhaften Netzwerk-Treibern auftreten. Versuchen Sie auch neuere und ältere Kartentreiber.

Weitere mögliche Fehler finden Sie am Ende der Anleitung von http://www.ltsp.org/download/lts/doc/lts.html

NFS Swapping

Der Einsatz von Boot-PCs eignet sich besonders, um aus alten Rechnern noch funktionierende X-Terminals zu basteln.
Allerdings besitzen diese alten Rechner häufig zu wenig RAM-Speicher, um auf Ihnen einige Programme oder gar einen X-Server zu starten.
Man könnte nun einen Swap-Speicher einrichten, allerdings verliert man dadurch den Vorteil, keine Geräusche zu erzeugen, da man dann doch wieder eine Festplatte einbauen müsste.
Ein Ausweg aus diesem Problem schafft ein Hacker-Patch zum Linux-Kernel, der es ermöglicht, auf dem Client eine Swap-Datei einzurichten, die auf dem NFS-Server liegt, aber als vollwertiger Swap-Ersatz genutzt werden kann.
Auf dem Server müssen dafür keine Änderungen vorgenommen werden, so daß man sich keine Angst um die Stabilität des Servers machen muß.

Allerdings hat dieser Patch zwei nicht zu unterschätzende Nachteile:

  • Swap-Speicher auf einem NFS-Laufwerk ist seeehr langsam. Sein Einsatz sollte daher nur auf Systemen erfolgen, die wirklich über derartig wenig RAM verfügen, daß verschidene Programme gar nicht erst gestartet werden können (bis 8MB RAM).
  • Swap-Speicher auf einem NFS-Laufwerk wirft mehrere Sicherheitslöcher auf, da Ihr Speicher unverschlüsselt übers Netzwerk übertragen wird und somit Paßwörter, die im Speicher abgelegt wurden, abgefagen werden können
Sollte Sie das alles nicht abgeschreckt haben, können wir loslegen.
Zunächst holt man sich ein für den gewünschten Kernel benötigten Patch von http://www.instmath.rwth-aachen.de/~heine/nfs-swap/nfs-swap.html.
(Es stehen nicht für alle Kernel-Versionen geeignete Patches zur Verfügung.)

Vor dem Einspielen des Patches sollte man sich eine Kopie des Kernels machen.

>> mkdir /usr/src/hacking
>> cp -a /usr/src/linux /usr/src/hacking/
danach geht man in das Verzeichnis /usr/src/hacking/linux und führt dort das Einspielen des Patches aus:
gunzip -c /path/to/linux-2.*.*-nfs-swap.diff |  patch -p1 -l -s
Danach muß man den Kernel erneut kompilieren und zusätzlich folgende Optionen aktivieren:

zusätzliche Kernel-Optionen
Code maturity level options 
              Prompt for development and/or incomplete code/drivers 
       Networking options 
              Swapping via network sockets (EXPERIMENTAL) 
       Filesystems/Network File Systems 
              Swapping via NFS (EXPERIMENTAL) 

Der Kernel muß wie oben beschrieben mittels mknbi und rdev zum Netzwerkbooten vorbereitet werden und an die Stelle des vorher benutzen Kernels kopiert werden.
Daraufhin booten wir den Client und führen den Befehl

>> cat /proc/meminfo
aus. Wir erhalten als Ausgabe etwa:
Ausgabe cat /proc/meminfo
        total:    used:    free:  shared: buffers:  cached:
Mem:   6938624  5767168  1171456  4685824        0  3690496
Swap:        0        0        0
MemTotal:      6776 kB
MemFree:       1144 kB
MemShared:     4576 kB
Buffers:          0 kB
Cached:        3604 kB
SwapTotal:        0 kB
SwapFree:         0 kB

Wie man sieht, existiert noch kein Swap-Speicher. Dies werden wir schleunigst ändern.

>> dd if=/dev/zero of=/SWAPFILE bs=1k count=20480
>> mkswap /SWAPFILE 20480
>> swapon /SWAPFILE
Danach schauen wir nochmal mittels
>> cat /proc/meminfo
und erhalten nun
Ausgabe cat /proc/meminfo
        total:    used:    free:  shared: buffers:  cached:
Mem:   6938624  5783552  1155072  4685824        0  3690496
Swap: 20967424        0 20967424
MemTotal:      6776 kB
MemFree:       1128 kB
MemShared:     4576 kB
Buffers:          0 kB
Cached:        3604 kB
SwapTotal:    20476 kB
SwapFree:     20476 kB

Wir haben nun 20 MB zusätzlichen Swap-Speicher installiert!
Somit ist es auch möglich, größere Programme zu starten, ohne daß uns der Speicher ausgeht.

Endlich ist es geschafft, aber Sie wurden ja gewarnt, daß die Installation eines netzbootenden-PCs durchaus nicht trivial ist.


Links:
http://web.singnet.com.sg/~leetc/howto/x-terminal.html Eine knapp gehaltene Anleitung zum Installieren eines X-Terminals.
Außerdem findet man verschiedene Skripte zum automatischen Konfigurieren der PCs.
Benutzt Bootp statt DHCP.
http://www.ltsp.org/download/lts/doc/lts.html Hat man eine große Anzahl von X-Terminals zu installieren, eignet sich dieses Paket, welches viel Konfigurationsarbeit vereinfachen kann.
Auf jeden Fall lohnt es sich, die Anleitung zu lesen, auch wenn man nur wenige X-Terminals zu installieren hat.
Es finden sich mehrere Tips zum Optimieren des Servers und verschiedene Hinweise zur Fehlersuche.
http://batronix.com/elektronik/bauanleitungen/eeprommer.shtml Falls Ihnen der Kauf eines Eprom-Brenners zu teuer ist, können Sie sich mit dieser Anleitung auch selbst einen bauen.
http://metalab.unc.edu/pub/Linux/system/
boot/ethernet/diskless/Dless-Linux.README
Eine kleine Anleitung zum Einrichten eines plattenlosen Rechners
http://www.linuxdoc.org/HOWTO/mini/NFS-Root.html Mini-Howto zum Installieren und Konfigurieren eines PCs mit Root-Partition, die mittels NFS gemountet wird.
http://www.nilo.org/remoteboot/Remote-Boot.html Nilo ist ein Netwerk-Lilo, welches zum Booten von verschiedenen Konfigurationen und Betriebsystemen (auch übers Netz) benutzt werden kann.
http://etherboot.sourceforge.net/ Etherboot ist ein weiteres Paket zum Herstellen von Bootroms. Allerdings noch nicht so ausgereift und umständlicher zu installieren als netboot.
http://www.online-club.de/m0/rp10067/diskless/grundlagen.html Hier finden Sie eine kurze deutsche Anleitung zur Konfiguration eines diskless Clients
http://www.instmath.rwth-aachen.de/~heine/nfs-swap/nfs-swap.html Die Homepage des NFS-Swap-Patches. Beachten Sie die Sicherheitsrisiken!


Platz für Kommentare & Fragen:
(selbst eintragen)

    -Bootcode im Mainboard-BIOS - 28.6, Dirk

 

Weitere Ausgaben Linux NetMag
[ #1 | #2 | #3 | #4 | #5 | Main ]