[home]

Vom Netzwerk booten

Über das Netz zu booten, das ist für Linux eigentlich kein Thema. Die hier präsentierte Methode kann also nur für einige Sonderlinge von Interesse sein, denn der einzig richtige Weg, über das Netz zu booten, ist längst mehrfach entdeckt worden.

Da die 3,5''-Diskette mittlerweile auch schon exotisch ist, wird sie als imaginäres oder auch reales ursprüngliches Bootmedium benutzt. D.h. sie gibt die Größe vor. Der Inhalt kann jedoch ebenso auf einer CD liegen. Wenn man jede Diskussion, ob das nicht ein Booten von Diskette sei, vermeiden will, dann gehört der Inhalt also in das ROM der Netzwerkkarte.

Als Server kommt ein Web-Server (durchaus auch unter Windows) zum Einsatz. Es überrascht also kaum, dass dessen Adresse hard coded ist. Er muss sich (aktuell) per IP ansprechen lassen.

Zum Client sollte schon eine 100 MBit-Ethernet-Verbindung bestehen. Der Client bezieht seine IP per DHCP, sodass das Netzwerk irgendwo noch einen DHCP-Server beschäftigen muss. (Das lässt sich zwar sehr, sehr einfach (mit einer statischen IP) ändern, aber dann sind mehrere Clients deutlich problematischer und ein Gateway wird schnell zum geschlossenen Tor.)

Der Client benötigt 128 MByte RAM (das hängt natürlich hauptsächlich vom übrigen System ab) und muss von der imaginären Diskette booten können. Eine Platte ist nicht nötig.

Konzeptionell wird lediglich die Cloop-Datei einer KNOPPIX-CD von dieser auf den Web-Server verschoben und per httpfs wird die Cloop-Datei wieder lokal verfügbar. Bei einer KNOPPIX-3.7-CD würden demnach ca. 700 MByte auf den Server verschoben und lediglich linux24, minirt24.gz und der Bootloader verblieben beim Client.

sh-2.05b# tree -s static
static
|-- [   142728]  ash
|-- [        3]  init -> ash
|-- [    29941]  insmod
|-- [      600]  modprobe
`-- [        3]  sh -> ash

0 directories, 5 files
Sieht man sich minirt24 genauer an (schließlich soll httpfs integriert werden), so wird schnell klar, dass hier so gut wie nichts läuft bis es möglich ist, auf die Cloop-Datei zurück zu greifen. Insbesondere findet die Netzwerk-Konfiguration erst in der Komfort-Umgebung statt. (Wäre auch nicht ganz einfach, ohne die Treiber für die Ethernet-Schnittstelle aus der Cloop-Datei das Netzwerk zu konfigurieren.)

Findet KNOPPIX seine Cloop-Datei nicht, so präsentiert es die spartanische Umgebung von minirt24 pur, die nicht mal ls bietet. Selbst wenn httpfs keine sonstigen Abhängigkeiten hätte (fusermount), so setzt es jedenfalls ein konfiguriertes Ethernet voraus. Das verlangt nach z.B. ifconfig und route. Dass diese aber per se in der kastrierten Umgebung laufen, ist eher unwahrscheinlich. (Man versteht unmittelbar, wie es zu der Bezeichung Booten kam.)

Rechnet man ca. 1 MByte für den Kern linux24, so bleiben ca. 400 MByte für minirt24 (und 0 für den Bootloader: boot.msg, ldlinux.sys und syslinux.cfg). Dabei ist die Größe einer Floppy von ca. 1,4 MByte als (eher sportliche, denn technische) Grenze unterstellt. Das ist letztlich zu wenig, selbst wenn man die Module für das Booten von CD, USB etc. aus minirt24 entfernen wollte. Glücklicherweise reicht es jedoch aus, fuse.o, fusermount und httpfs noch auf den Server zu verschieben, sodass die ursprünglichen Boot-Methoden unberührt bleiben. (Es bleibt sogar Platz, eine weitere Ethernet-Karte zu unterstützen.)

Es erscheint zwar widersinnig, die von httpfs geforderte Netzwerk-Konfiguration nach minirt24 zu verschieben und httpfs selbst nicht in minirt24 zu integrieren, aber so ist Booten: Mit einem wget, das nur 426 Byte (< 0,5 KByte) groß ist, werden die fehlenden Teile vom Server in die entpackte Ramdisk minirt24 nachgeladen. (Die entpackte Ramdisk bietet reichlich Platz. Nebenbei bemerkt, wird sie fast vollständig geleert, wenn die Cloop-Datei die Regie übernimmt, denn z.B. für /etc wird auch wieder Platz benötigt.)

Inhalt von static:
139.4k  ash*
 50.3k  udhcpc*
  1018  ls*
   763  cp*
   504  ps*
   502  ifconfig*
   485  rm*
   426  wget*
   320  ping*
   260  udhcpc.sh*
   255  mkdir*
   217  reboot*
   165  chmod*
   142  ln*
     8  route -> ifconfig*
     6  halt -> reboot*
     6  poweroff -> reboot*
     3  init -> ash*
     3  sh -> ash*
Die Erweiterungen in minirt24 bestehen einerseits aus zusätzlichen Modulen für die Ethernet-Schnittstelle in /modules und deren Nutzung in linuxrc und andererseits aus zusätzlichen Binaries in /static (Es wurde nichts gelöscht sondern eine Variante zur Grundlage genommen).
 
Die unglaublich kleinen Binaries (keine Shell-Scripts) stammen aus den asmutils. Es sind Assembler-Programme, die direkt Kernelfunktionen aufrufen, sodass die C-Bibliothek nicht erforderlich ist. Ausserdem wurden sie gestriped - wie es strip nie könnte.(file meldet für diese Binaries auch nur einhellig 'ERROR: Corrupted section header size'). Schließlich bieten sie i.a. nicht einmal ansatzweise die Funktionalität der gleichnamigen Linux-Programme.

wget z.B. kann nur als wget IP path/file aufgerufen werden. Dabei wird http://IP/path/file nur dann geladen, wenn der Ordner path bereits lokal existiert. Es ist also durchaus eine glückliche Fügung, dass diese Programme beim Booten gelöscht werden.

Der DHCP-Client udhcpc ist hingegen ein normales Programm, das - wie der Name andeutet - gegen uclibc (statisch) kompiliert/gelinkt ist. Es ist nicht upx-komprimiert, da es sonst nicht funktionieren würde (- nicht generell, aber in minirt24).

Für eine minirt24 von z.B. 4500 KByte muss man mit einer minirt24.gz von 2000 KByte rechnen - es sei denn, minirt24 enthält hauptsächlich ein bestimmtes Byte in zigfacher Wiederholung. D.i. jedoch nach einigen Experimenten nicht mehr der Fall, denn auch gelöschte Dateien hinterlassen ihre Spuren.

Um eine Größe der minirt24.gz von etwa 50% des in minirt24 belegten Speichers zu erhalten, muss der unbelegte Speicher also homogenisiert werden.

	dd if=/dev/zero of=trash
füllt die Ramdisk bis zum Überlaufen mit '0'. Nach einem umount ist alles geschrieben, sodass anschließend trash entfernt werden kann (und sollte).

Der Lohn der Mühe ist eine Floppy bzw. deren Äquivalent, die es erlaubt, von einem gewöhnlichen Web-Server zu booten. Dabei ist die Arbeit auf dem Server - zumindest im LAN - eher flotter als die Arbeit von CD. Die Geschwindigkeit des LANs ist nicht so entscheidend wie die Größe des Arbeitsspeichers des Client. Eine auf 16K reduzierte blocksize der Cloop-Datei wäre vielleicht zu empfehlen.

(Wo Abhängigkeiten bestehen ist Kern 2.4.27 und gcc 2.95.4 vorausgesetzt.)

Nachtrag

Eigentlich sollte man in linuxrc auch

	mknod /dev/fuse c 10 229
	chmod 666 /dev/fuse
erwarten, wenn das Modul fuse.o nachgeladen werden muss. (Die asmutils haben auch dafür eine Lösung.) Es ist jedoch einfacher - wenn man minirt24 schon unter dem Messer hat - das Device gleich in /dev zu erzeugen.

[home]