28.March 2024    
   homeProjekteLinuxDiskless Linux

 

Hobby 234x60
reichelt elektronik – Elektronik und PC-Technik
Seite zuletzt geändert: 07.11.2012 09:20

Diskless Linux

Dieser Beitrag soll die Installation einer "Diskless Linux Station" beschreiben.

Voraussetzungen

  • Kernel-Source und Übersetzungswerkzeuge sowie etwas Kenntnisse in der Konfiguration und beim Übersetzen von Linux-Kernels
  • Paket "mknbi"
  • Bootprom oder Boot-Diskette
  • 1 Rechner als Server
  • 1 oder mehrere Rechner als Clients

Vorbereitung eines Client-Kernels

Zunächst benötigen wir einmal den Kernel-Source. Den holen wir uns am besten von www.kernel.org mit


wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.23.tar.bz2


Dieses Paket legen wir unter /usr/src ab und entpacken es mit


tar -xjvf linux-2.6.23.tar.bz2


Anschließend setzen wir noch mit


ln -s linux-2.6.23 linux


einen symbolischen Link.

Anschließend wechseln wir nach /usr/src/linux und rufen dort


make menuconfig


auf.

Wir konfigurieren den Kernel nach unseren Bedürfnissen, müssen aber auf folgende Punkte achten:


Loadable module support  --->
    [*] Enable loadable module support


Device Drivers  --->
    Network device support  --->
        [*] Network device support


Networking  --->
    [*] Networking support
    Networking options  --->
        <*> Packet socket
        <*> Unix domain sockets
        [*] TCP/IP networking
        [*]   IP: kernel level autoconfiguration
        [*]     IP: DHCP support


und ebenfalls hier unter einer oder mehrerer der folgenden Punkte die Unterstützung für die verwendete(n) Netzwerkkarte(n) eincompilieren (also NICHT als Modul!!!):


        Ethernet (10 or 100Mbit)  --->
        Ethernet (1000 Mbit)  --->
        Ethernet (10000 Mbit)  --->


Device Drivers  --->
    [*] Virtual terminal
    [*] Support for console on virtual terminal


File systems  --->
    Pseudo filesystems  --->
        [*] /proc file system support
    Network File Systems  --->
        <*> NFS file system support
        [*]   Provide NFSv3 client support
        [*] Root file system on NFS


Wenn wir die Konfiguration fertig haben, beenden und abspeichern und mit


make bzImage


übersetzen. Wir erhalten als Resultat (sofern keine Fehler beim Compilieren auftreten) unter /usr/src/linux/arch/i386/boot die Datei bzImage.

Unser Client muss sich seine Daten später ja irgendwoher holen - nämlich über NFS vom Server. Er braucht dazu ein Verzeichnis auf dem Server, in den wir alles reinlegen, was der Client später braucht - sozusagen eine virtuelle Festplatte für den Client. Das legen wir an mit


mkdir /diskless/station1


Von dem generierten Image kann aber unser Client nicht booten - dazu muss es etwas nachbehandelt werden. Das passiert mit:


mkelf-linux --ip=rom --rootdir=/diskless/station1 /usr/src/linux/arch/i386/boot/bzImage > /diskless/station1/nfskernel


Der Parameter "ip=rom" gibt an, dass die IP-Adresse vom DHCP-Server übernommen wird.

Vorbereitung Server

Zunächst eine Vorbemerkung: Wir richten hier einen neuen DHCP-Server im Netz ein. Standardmäßig spielen aber auch die meisten ISDN- und DSL-Router automatisch DHCP-Server. Wenn sich mehrere DHCP-Server im Netz befinden, ist es dem Zufall überlassen, welchen die Clients benutzen. Damit wir dort keine Probleme bekommen - alle anderen DHCP-Server ausschalten und nur noch den DHCP-Daemon auf dem Linux-Server laufen lassen!

Der Server muss zunächst, der Client-Kernelkonfiguration entsprechend, über einen DHCP-Daemon verfügen. Diesen richten wir ein mit


apt-get install dhcp3-server


Davon wird gleichzeitig auch noch das Paket dhcp3-common installiert.

Die Installation hinterlässt uns nun eine Datei /etc/dhcpd.conf. Die passen wir uns erst mal so an, dass sie für unser Netzwerk passt.

Unser Domainname und unser lokal verfügbarer DNS-Server, die den Clients zugewiesen werden sollen:


option domain-name "t0000000.de";
option domain-name-servers 10.1.1.1;


für JEDES (!!!) Subnetz, für das sich der Server zuständig fühlt, muss ein Abschnitt etwa in der folgenden Form vorliegen. Dieser Abschnitt sagt dem DHCP-Server, welche Adressen er in welchem Subnetz vergeben darf. Falls vorher ein DHCP-Server auf einem Router aktiv war, dann sollte dieser Abschnitt den Einstellungen auf dem Router entsprechen


subnet 10.1.1.0 netmask 255.255.255.0 {
  range 10.1.1.100 10.1.1.200;
  option broadcast-address 10.1.1.255;
  option routers 10.1.1.1;
}


Dann tragen wir noch einen neuen Abschnitt für unsere Diskless Linux-Station ein:


host diskless1 {
  hardware ethernet 00:03:xx:xx:xx:xx;
  fixed-address 10.1.1.199;
  filename "/diskless/station1/nfskernel";
  server-name "diskless1.t0000000.de";
}


Die "hardware ethernet"-Zeile muss die MAC-Adresse unserer Diskless Station enthalten. Wenn wir die nicht haben - nicht so schlimm, die können wir auch später noch ermitteln.
"fixed-address" gibt natürlich an, welche IP-Adresse unsere Station bekommen soll, "server-name" sagt ihr ihren künftigen Namen.
"filename" zeigt auf den Kernel, den wir im vorigen Abschnitt erstellt haben.

Wir speichern die Datei ab und starten den dhcpd neu mit


/etc/init.d/dhcp restart


Damit wartet der DHCP-Server auf die Anfrage unseres Clients.

Der Client soll aber sein Daten per NFS holen - der Server muss darüber also Bescheid wissen. Dementsprechend tragen wir in die Datei /etc/exports einen passenden neuen Export für den Client ein:


/diskless/station1 10.1.1.199(rw,no_root_squash,no_all_squash)


Falls wir für den Zugriff auf den NFS-Server auch die hosts.deny/hosts.allow benutzen, müssen wir die IP-Adresse des Clients in der Datei hosts.allow noch bei "mountd" und bei "portmap" eintragen. Auf die Freischaltung in der Firewall des Servers gehe ich hier nicht ein - wer so schlau war, die Firewall zu konfigurieren, weiß auch, wie er NFS für den Client freigibt.
Mit


/etc/init.d/nfs-kernel-server reload


geben wir dem NFS-Server die neuen Daten.

Wie kann unser System nun booten?

Voraussetzung ist, dass das Bootsystem in der Lage ist, sowohl per DHCP die Konfiguration als auch per NFS den Kernel zu holen.

Über die Seite http://rom-o-matic.net kann man sich einen Datenträger erstellen, mit welchem man sein System auf die gewünschte Weise booten kann.

Vorgehen:

  1. Auswahl der in der Regel aktuellsten Version
  2. Wahl der Netzwerkkarte
  3. Ausgabeformat: Wir nehmen jetzt einfach mal das "Floppy bootable ROM Image (.zdsk)"
  4. Weiter geht's mit der Konfiguration ("Configure"-Knopf neben "(optional) To customize ROM configuration press:" drücken
  5. Wir können alle Optionen auf Standard lassen mit Ausnahme von "DOWNLOAD_PROTO_NFS" und "DEFAULT_PROTO_NFS". Die aktivieren wir beide.
  6. Ganz unten finden wir dann den Knopf "Get ROM"
  7. Die erhaltene Datei müssen wir nun auf Diskette schreiben. Dazu brauchen wir eine leere Diskette und das Programm "rawrite", welches als DOS-Version rawrite2.zip und als Windows-Version rwwrtwin.zip vorliegt.

Außer der Möglichkeit des "Floppy bootable ROM Image (.zdsk)" gibt es auch noch die Variante "DOS Executable ROM image (.com)". Für alle diejenigen, die dem rawrite misstrauen, ist das auch eine Lösung.

Was brauchen wir? Zunächst eine DOS-Bootdiskette oder eine Win98-Startdiskette. Letztere kann man sich in Windows 98 in der Systemsteuerung unter "Software" erstellen. Allerdings lässt sich diese dann nicht direkt so verwenden.

Bei einer Win98-Startdiskette müssen wir erst ein wenig Platz schaffen. Dazu können wir die diversen Treiber (z.B. BTCDROM.SYS, BTDOSM.SYS, OAKCDROM.SYS) auf der Diskette löschen, die brauchen wir alle nicht.

Dann ändern wir die config.sys, die darf auf keinen Fall so bestehen bleiben, sonst funktioniert das Bootimage nicht. Die config.sys könnte so aussehen:


files=10
buffers=10
stacks=9,256
lastdrive=z


Auf KEINEN Fall darf in der config.sys der himem.sys geladen werden!

Die autoexec.bat sieht dann ganz anders aus als das Original, hier reicht folgender Inhalt:


@ECHO OFF
eb-543~1.com


Es kann auch auf das "@ECHO OFF" verzichtet werden.

Wichtig ist die richtige Notation des Image-Namens. Der Original-Dateiname von rom-o-matic ist länger als die 8.3-Notation von DOS. Dementsprechend können wir diesen Namen in der autoexec.bat nicht benutzen. Entweder wir nehmen hier die 8.3-Konvertierung, die für die erste Datei, auf die das zutrifft, aus den ersten 6 Zeichen des langen Namens besteht, gefolgt von "~1" (die zweite Datei würde dann ein "~2" bekommen).

Wenn die Originaldatei also "eb-5.4.3-3c509.com" heißt, dann ergibt sich als kurzer Dateiname das oben gezeigte "eb-543~1.com".

Wer allen Problemen aus dem Weg gehen will, benennt die Originaldatei so um, dass sie der 8.3-Notation entspricht, also z.B. in "diskless.com". Dann besteht die autoexec.bat entsprechend aus dem Inhalt


@ECHO OFF
diskless.com


Mit dieser Diskette können wir unsere diskless station dann auch starten, allerdins dauert der Start um einiges länger, weil ja zunächst DOS bzw. der DOS-Part von Windows 98 gestartet werden muss.

 

Wir legen einfach mal die im vorigen Abschnitt erstellte Diskette ein und starten den Rechner davon.

Was nun passiert, hängt auch davon ab, wie erfolgreich wir in den vorigen Abschnitten waren.

Zunächst versucht das Bootsystem, die Netzwerkkarte zu finden, den DHCP-Server zu kontaktieren und die nötigen Daten von ihm zu bekommen. Wenn wir die MAC-Adresse von unserer diskless station noch nicht wussten - jetzt können wir sie ermitteln und zwar über das syslog unseres Servers. Sofern überhaupt eine Netzwerkkarte ermittelt wurde (falls nicht, müssen wir evtl. einen anderen Typ wählen), finden wir folgende Einträge im syslog:


Feb 15 15:33:00 server dhcpd: DHCPDISCOVER from 00:03:xx:xx:xx:xx via eth0
Feb 15 15:33:00 server dhcpd: DHCPOFFER on 10.1.1.199 to 00:03:xx:xx:xx:xx via eth0
Feb 15 15:33:00 server dhcpd: Dynamic and static leases present for 10.1.1.199.
Feb 15 15:33:00 server dhcpd: DHCPREQUEST for 10.1.1.199 from 00:03:xx:xx:xx:xx via eth0
Feb 15 15:33:00 server dhcpd: DHCPACK on 10.1.1.199 to 00:03:xx:xx:xx:xx via eth0


Falls wir in der dhcpd.conf noch nicht die richtige MAC-Adresse eingetragen hatten, dann wird unserem gerade gebooteten System natürlich eine ganz andere IP-Adresse zugewiesen und die Log-Einträge sehen etwas anders aus, vor allem findet natürlich auch kein Boot statt. Dafür wissen wir nun aber, welche MAC-Adresse unsere diskless station hat und können den richtigen Eintrag in der dhcpd.conf machen. Nicht vergessen, den dhcp-Daemon danach neu zu starten!

Als nächsten Eintrag sehen wir dann in unserem syslog:


Feb 15 15:33:00 server mountd[30010]: authenticated mount request from 10.1.1.199:700 for /diskless/station1 (/diskless/station1)


Dieser Eintrag erfolgt zeitgleich mit entsprechenden Ausschriften auf der diskless station - dort beginnt nämlich der Bootloader, den Kernel vom nfs-Server zu holen. Sofern wir beim Erstellen der Bootdiskette nicht gerade die Option "BAR_PROGRESS" aktiviert haben, erscheinen jede Menge Punkte auf dem Bildschirm und anschließend die gewohnten Ausschriften des Linux-Boots.

Allerdings existiert auf dem Server noch keine Linux-Installation für die diskless station - dementsprechend wird zwar der Kernel geladen, aber alles weitere scheitert, weil keine Dateistruktur vorliegt. Diese legen wir im nächsten Abschnitt an.

Die einfachste Variante, ein Client-Linux zur Verfügung zu stellen, ist, ein vorhandenes Linux in das Verzeichnis /diskless/station1 zu kopieren. Eine Möglichkeit bestände darin, die Station, die später diskless werden soll, zeitweilig mit einer Festplatte auszustatten und auf diese ein Linux zu installieren. Dabei sollte die Festplatte nur in eine Partition geteilt werden, da wir ja später auf dem Server auch nur eine virtuelle Partition für die diskless station haben.

Wenn das erledigt ist und alles zur Zufriedenheit läuft, den Server mounten mit


mount server:/diskless/station /mnt


und dann den Inhalt der Platte auf den Server kopieren mit


cp -axuv / /mnt


Das dauert dann seine Zeit, bis alles kopiert ist. Anschließend können wir mit


umount /mnt


die Verbindung wieder trennen und die Festplatte wieder entfernen.

Allerdings müssen noch Änderungen an Konfigurationsdateien vorgenommen werden:

In der Datei /etc/fstab ersetzen wir die Zeile, in welcher die Festplattenpartition gemountet wurde.

Die Originalzeile wird aussehen wie z.B.


/dev/hda1      /               ext2    errors=remount-ro       0       1


Die kommentieren wir aus und fügen die Zeile


server:/diskless/station1    /       nfs


hinzu, so dass das Ergebnis so aussehen könnte:


# /etc/fstab: static file system information.
#
# <file system> <mount point>   <type>  <options>               <dump>  <pass>
server:/diskless/station1    /       nfs
#/dev/hda1      /               ext2    errors=remount-ro       0       1
proc            /proc           proc    defaults                0       0
/dev/fd0        /floppy         auto    user,noauto             0       0
/dev/hdc       /cdrom          iso9660 ro,user,noauto,exec             0       0


...wird noch fortgesetzt...

Copyright © 2008-2017