Dieser Beitrag soll die Installation einer "Diskless Linux Station" beschreiben.
- 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
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.
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: - Auswahl der in der Regel aktuellsten Version
- Wahl der Netzwerkkarte
- Ausgabeformat: Wir nehmen jetzt einfach mal das "Floppy bootable ROM Image (.zdsk)"
- Weiter geht's mit der Konfiguration ("Configure"-Knopf neben "(optional) To customize ROM configuration press:" drücken
- Wir können alle Optionen auf Standard lassen mit Ausnahme von "DOWNLOAD_PROTO_NFS" und "DEFAULT_PROTO_NFS". Die aktivieren wir beide.
- Ganz unten finden wir dann den Knopf "Get ROM"
- 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...
|