Sorry, no english translation yet. Just download the initrd template ird-dlc.tar.gz and the example file list ird-dlc-list.txt and read the scripts /sbin/init, /etc/load-interfaces, /etc/dhclient-exit-hooks and the documenation of the involved tools.

Generische Initrd für Diskless Clients

Das hier vorgestellte Setup eignet sich zum Booten von Diskless Clients. Dabei kann ein möglichst generischer, modularisierter Kernel verwendet werden. Sämtliche Kommunikation mit dem Bootserver (per BOOTP/DHCP) findet im Userspace statt, d.h. man braucht keinen speziellen Kernel mit BOOTP-Support. NFS sowie Treiber für diverse Netzwerkkarten können als Module gebaut und auf die Initrd kopiert werden, welche Module für einen speziellen Client letzliche geladen werden, wird per Kernel-Commandline bestimmt. Zusammen mit einem netzwerkfähigen Bootloader, der einen Kernel mit Initramdisk laden sowie eine Kernel-Commandline übergeben kann (z.B. GRUB), reduziert sich die Konfiguration eines neuen Diskless Client damit auf einen einfachen Eintrag in /etc/bootptab und/oder einem GRUB-Menü-File und natürlich dem Anlegen eines Verzeichnisses, das dem Client später als NFS-Root dient.

Prinzip

Kernelkonfiguration

Nicht benötigt werden: CONFIG_NFS_ROOT und CONFIG_IP_PNP (BOOTP, RARP oder DHCP). Je nach Kernel braucht man allerdings eine Initramdisk (CONFIG_BLK_DEV_RAM und CONFIG_BLK_DEV_INITRD) oder einen gepatchten Kernel mit Inittar-Support (Initramdisk auf tmpfs, Files werden aus einem Tar-Archiv geladen). Bei Verwendung einer Initramdisk wird natürlich auch noch ein geeignetes Filesystem benötigt, z.B. minix. Das Filesystem muß schreibbar sein, ein ROMFS funktioniert hier leider nicht.

Alles weitere kann modularisiert werden. Es werden auf jeden Fall NFS (CONFIG_NFS_FS) und Packet Socket (CONFIG_PACKET) benötigt. Dazu kommen Treiber für alle in Frage kommenden Netzwerkkarten.

Aufbau der Initrd

Eine vollständige Liste aller Dateien für mein Beispiel-System steht in ird-dlc-list.txt. Die verwendete Release ist 2.4.12-mk3 (2.4.12 mit Inittar-Patch), an Netzwerkkarten werden lediglich ne2000-kompatible Karten unterstützt (ne.o). Natürlich können beliebig viele Treiber installiert werden. Ein Template für so eine Initramdisk ist in ird-dlc.tar.gz zu finden. In dieser Datei ist lediglich die Verzeichnisstruktur, ein paar Devices in /dev das Script /sbin/init sowie ein paar Files in /etc zu finden. Der Rest (Libraries, Programme in /bin und /sbin, Kernelmodule) muß je nach System noch dazukopiert werden.

Abgesehen von den Dateien /etc/fstab (die lediglich einen Eintrag für /proc enthält) und /etc/dhclient.conf (zusätzliche Anforderung des Root-Pfades) bleiben drei Dateien, in denen die ganze Magie stattfindet:

/sbin/init auf dem NFS-Rootfs

Nach dem Start des "echten" /sbin/init sind noch einige Dinge zu erledigen:

Hier ein Auszug aus /etc/rc.d/rc.sysinit meines DLCs (dieses Script wird von /sbin/init gestartet):

# Mount /proc and fix mtab
mount /proc
cat /proc/mounts > /etc/mtab

# Kill dhclient (if still running)
kill `cat /old-root/var/run/dhclient.pid`

# Fetch resolv.conf created by dhclient
if [ -e /old-root/etc/resolv.conf ]; then
    cp -p /old-root/etc/resolv.conf /etc
else
    echo "Warning: no /etc/resolv.conf"
fi

# Unmount old-root. Or not.
if [ "$keep_old_root" = yes ]; then
    echo "Keeping initial tmpfs in /old-root"
else
    echo "Unmounting initial tmpfs"
    umount /old-root
    rmdir /old-root
fi

# Start the portmapper and remount with locking enabled
portmap
mount -o remount,lock /

Achtung: das remount am Schluß klappt zumindest mit älteren Versionen von mount(8) nicht!

Kochrezept

Um ein hier beschriebenes DLC-Setup zu bauen, kann man folgendermaßen vorgehen:

Funktionsweise im Detail

Read the source! Also (auf der Initrd) /sbin/init, /etc/load-interfaces und /etc/dhclient-exit-hooks. Außerdem die Dokumentation zu dhcpclient, bootpd, ...


kili@outback.escape.de