PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Diskless boot: x86 mit floppy



sins
23.04.05, 21:13
Diskless boot: x86 mit floppy


Einleitung
"Diskless boot" bedeutet, dass der Kernel und das ganze / Dateisystem auf einem zentralen Server liegen und über das Netzwerk ausgelesen werden. Optional kann man mit ssh und XDMCP nach dem Booten auf dem Server arbeiten.

Ein über das Netzwerk gebooteter PC ist leiser, frisst weniger Strom und braucht keine zusätzliche Festplatte. Nachteile sind: er ist instabil, wenn das Netzwerk instabil ist und man muss mit kleinen Abstrichen in (praktischer) Funktionalität des X-servers rechnen, wenn man sich für xdmcp entscheidet und kein gigabit Netzwerk hat. So kann man z.B. Videos nicht flüssig abspielen.

Dieses HOWTO basiert auf den in "Credits" genannten Dokumentationen und soll lediglich, anhand eines bestimmten Beispieles, zeigen, wie eine praktische Problemlösung aussieht.


Technische Daten
Der Server ist mein Desktop PC mit AMD-K8 2000MHz und 512MB DDR-RAM. Als Client wurde ein auf AMD-K5 90MHz (i486) basierender PC mit 80MB EDO-RAM und einer billigen RTL8139 Netzwerkkarte verwendet. Das BIOS ist zu alt und unterstützt kein Netzwerkboot, weswegen ich die "Floppy-Variante" vorziehe.

Das Betriebssystem und die Architektur des Servers spielen keine sonderliche Rolle. Man muss lediglich tftpd, dhcpd und NFS Dienste zur Verfügung stellen können und Linux ist dafür hervorragend geeignet.

Anders sieht es bei Clients aus: FreeBSD und Linux werden am meisten Unterstützt. OpenBSD bootet bislang nur mit SIS und PXE Netzwerkkarten. (Kein Anspruch auf Vollständigkeit ;).

In meinem Fall wurde als Server ein Fedora Core 3 x86_64 Linux und als Client ein Slackware 10.1 Linux eingesetzt.


Der Server
Normalerweise benutzt man einen DHCP Server, um dem Client eine IP zuzuweisen. Das FC3 RPM gibt es auf einem der vielen Fedora mirrors (http://wftp.tu-chemnitz.de/pub/linux/fedora-core/3/i386/os/Fedora/RPMS/dhcp-3.0.1-11.i386.rpm), oder auf der Entwicklerseite als ein "source tarball" (http://www.isc.org/index.pl?/sw/dhcp/).

Nach der Installation muss man die Beispielconfig (/usr/share/doc/dhcp-[version]/dhcpd.conf.sample) nach /etc/dhcpd.conf kopieren und anpassen. In meinem Fall ist die Adresse des Servers 192.168.0.1/24 und des Clients 192.168.0.2/24. Die MAC Adresse des Clients (00:A1:B0:A1:BB:34) muss unbedingt angepasst werden.

Hier ist meine config:


default-lease-time 21600;
max-lease-time 21600;

option subnet-mask 255.255.255.0;
option broadcast-address 192.168.0.255;
ddns-update-style none;
option routers 192.168.0.1;
option domain-name "sindagos.org";
option root-path "192.168.0.1:/opt/clientroot";

group {
use-host-decl-names on;
host client {
hardware ethernet 00:A1:B0:A1:BB:34;
fixed-address 192.168.0.2;
filename "/xterm.nb";
}
}


Nun, wo dem Client eine IP zugewiesen werden kann, braucht man einen TFTP Server, der üblicherweise zur Weitergabe des Kernels, der gebootet werden soll verwendet wir RPM (http://wftp.tu-chemnitz.de/pub/linux/fedora-core/3/i386/os/Fedora/RPMS/tftp-server-0.39-1.i386.rpm) und SRC (http://www.kernel.org/pub/software/network/tftp/). Da tftp von xinetd gestartet wird, erstellt man nach der Installation die config /etc/xinetd.d/tftp:


# default: on
# description: TFTP Server
service tftp
{
disable = no
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /tftpboot
per_source = 11
cps = 100 2
flags = IPv4
only_from = 192.168.0.2
}

Ich gehe davon aus, dass ein NFS Server schon installiert ist. Wenn nicht, kann man hier ein HOWTO finden: nfs.sourceforge.net (http://nfs.sourceforge.net/).

Folgende configs sollten angepasst werden:


# echo "192.168.0.2 diskless.client client" >> /etc/hosts
# echo "/opt/clientroot 192.168.0.2(rw,no_root_squash,sync)" >> /etc/exports

Eventuell muss man den Paketfilter anpassen, sodass Verbindungen aufgebaut werden können. Starten und überprüfen der Dienste:


# /sbin/service dhcpd start
dhcpd starten: [ OK ]

# /sbin/service xinetd restart
xinetd beenden: [ OK ]
xinetd starten: [ OK ]

# /sbin/service nfs start
NFS-Dienste starten: [ OK ]
NFS Quota starten: [ OK ]
NFS-Daemon starten: [ OK ]
NFS mountd starten: [ OK ]

# netstat -tunlp
...
udp 0 0 192.168.0.1:137 0.0.0.0:* 4283/nmbd
...
udp 0 0 0.0.0.0:67 0.0.0.0:* 12677/dhcpd
...
udp 0 0 0.0.0.0:69 0.0.0.0:* 12776/xinetd
...

# lsof -i :69
xinetd 12776 root 5u IPv4 144400 UDP *:tftp



Clientroot
Jetzt brauchen wir noch den Kernel, der gebootet werden soll und das "root" Dateisystem. Am einfachsten ist es, ein Linux auf eine separate Festplatte, oder eine leere Partition zu installieren und diese zu mounten. In meinem Fall ist es /dev/hda8 mit 2,7G und einem frisch installiten Slackware 10.1 gemountet auf /opt/clientroot.
OPTIONAL: Man kann auch das vom Server verwendete Dateisystem kopieren. Um die "nodes" und "symlinks" nicht zu verlieren, erstellt man am bequemsten ein Archiv:


# tar cvpf client_root.tar /
# tar oxvpf client_root.tar /opt/clientroot/.

Damit der client-Kernel problemlos booten und das "NFS-Root" mounten kann, muss man ihn neu backen. Die aktuellen kernel sourcen gibt es auf kernel.org (http://kernel.org/), die man in /opt/clientroot/usr/src/ ablegen sollte. In meinem Fall ist es linux-2.6.11.7.

Danach:


server# cd /opt/
server# chroot clientroot /bin/zsh
client# mount -t proc none /proc
client# cd usr/src && tar xvzf linux-2.6.11.7.tar.bz2 && cd linux-2.6.11.7
client# make menuconfig

Jetzt muss man den Kernel, wie gewohnt, backen. (Dazu gibt es genug howtos hier im Forum und bei Mr. Google) Ich rate davon ab, einen Kernel zu backen, der vor dem Mounten des "/" module brauchen könnte, da es eventuell zu Problemem mit "initrd" führen kann. Zu beachten ist, dass folgende Optionen eingestellt sind:


IP: kernel level autoconfiguration
IP: DHCP support
IP: BOOTP support
[Modul mit den Netzwerkkartentreibern](in meinem Fall "RealTek RTL-8139 PCI")
ROM file system support
Kernel automounter support
NFS file system support
Root file system on NFS(!)

client# make && make modules_install

Wen man dennoch ein "initrd" benutzen will, ist mkinitrd(8) ein guter Anfang. Nach dem kompillieren des Kernels und der Installation der Module kann man chroot mit `exit` verlassen.

Jetzt muss man, aus dem kernel image eine ELF "binary" machen, die gebootet werden kann. Dazu braucht man `mkelf-linux`, was ein Teil des etherboot Projektes ist. Die mknbi Quellen gibt es auf: sourceforge.net (http://sourceforge.net/project/showfiles.php?group_id=4233) (unten).

Nach der Installation:


# cd /opt/clientroot/usr/src/linux-2.6.11.7/arch/i386/boot/
# mkelf-linux --rootdir=/opt/clientroot --rootmode=ro \
--ip=192.168.0.2:192.168.0.1:192.168.0.1:255.255.255 .0:diskless.client:eth0 \
bzImage > /tftpboot/xterm.nb



Bootdiskette
An Stelle einer Bootdiskette kann man auch das ROM der Netzwerkkarte benutzen, es ist aber bequemer, eine Diskette zu erstellen. Dazu benötigt man etherboot. Etherboot ist zwar nicht die einzige Möglichkeit, mit PC's über das Netzwerk zu booten, unterstützt jedoch, die meisten Netzwerkkartenchips. Der Link zum Download befindet sich auf der Etherbot Webseite (http://etherboot.sourceforge.net/). Nach dem Entpacken des Archivs sollte man die Dokumentation (http://etherboot.sourceforge.net/doc/html/userman/t1.html) lesen und Befolgen.

Hier ist eine grobe Zusammenfassung. Es sei nicht empfohlen, diese einfach abzutippen.


# cd etherboot-5.2.6/src
# make
# superformat /dev/fd0
# make bin/rtl8139.zfd0

Dies erstellt eine Diskette mit der man den Client booten kann.

Viel Spass!


Optional: XDMCP
Man kann, um die Ressourcen des Servers besser auszunutzen, auf diesem einen XDMCP Server starten und mit `X -query server` darauf Zugreifen. So konnte ich auf dem schwachen K-5 PC flüssig Firefox einsetzen, was lokal niemals möglich wäre.

Zu diesem Thema gibt es allerdings genug Dokus, wie auf lf.de, so auch im gesamten Internet und in /usr/share/doc jeder halbwegs vollständigen Distribution.

Credits
Ich bedanke mich bei den Authoren folgender Dokumentationen und HowTo's:
Etherboot (http://etherboot.sourceforge.net/)
Etherboot Dokumentation (http://etherboot.sourceforge.net/doc/html/userman/t1.html)
diskless boot using Fedora Core 1 (http://cns.georgetown.edu/~ric/howto/diskless/)
Linux Terminal Server Project (http://www.ltsp.org/)
Netboot HOWTO (http://netboot.sourceforge.net/texts/HOWTO.html)
... und bei den usern, die mir auf #lf.de geholfen haben:
#linuxforen.de @ irc.linuxforen.de






Wenn etwas nicht stimmt, bitte um PN, oder Mail an mich.

MfG, sins