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.
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.
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:
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!
Um ein hier beschriebenes DLC-Setup zu bauen, kann man folgendermaßen vorgehen:
make INSTALL_MOD_PATH=/tmp modules_installmachen, sonst überschreibt man die bereits vorhandenen Module! Mit obiger Zeile landen die Module in /tmp/lib/modules/$version.
mkdir /tmp/ird cd /tmp/ird gzip2 -cd $somewhere/ird-dlc.tar.gz | tar xf -Anschließend die Programme cat, cp, expr, hostname, mkdir, mount, sed, sh, sleep, umount, uname nach /tmp/ird/bin, die Programme dhclient, dhclient-script, ifconfig, insmod, modprobe, pivot_root und rmmod nach /tmp/ird/sbin, die benötigten Libraries nach /tmp/ird/lib und die erforderlichen Module (mit allen gewünschten Netzwerktreibern) nach /tmp/ird/lib/modules kopieren. Eine Beispielliste der gesamten Initrd steht in ird-dlc-list.txt. Die benötigten Libraries und Module hängen natürlich vom jeweiligen System ab.
chroot /tmp/ird /depmod -a -F /System.map (Kernelversion)modules.dep bauen. Bei Problemen sei auf die Manpage depmod(8) verwiesen. System.map und depmod können danach wieder aus /tmp/ird gelöscht werden.
cd /tmp/ird; tar cf /tftpboot/inittar-2.4.12-mk3.tar *
title GNU/Linux-2.4.12-mk3 with inittar root (nd) kernel /tftpboot/bzImage-2.4.12-mk3 interfaces=ne initrd /tftpboot/inittar-2.4.12-mk3.tarMein Spielzeug-Client läuft leider nicht, wenn man ihm nicht IO-Port und IRQ für die Netzwerkkarte mitteilt, daher sieht die Kernel-Zeile hier etwas anderes aus:
kernel /tftpboot/bzImage-2.4.12-mk3 interfaces=ne,io=0x300,irq=3Für Clients mit anderen Netzwerkkarten muß bei "interfaces" entsprechend etwas anderes angegeben werden. Es können auch mehrere Netzwerkkarten angegeben werden, z.B. mit
kernel /tftpboot/bzImage-2.4.12-mk3 interfaces=ne;3c509Die angegeben Module werden dann nacheinander geladen. Ich weiß allerdings nicht so genau, was dhclient dann damit anfängt bzw. über welches Interface dann letztlich gebootet wird.
Read the source! Also (auf der Initrd) /sbin/init, /etc/load-interfaces und /etc/dhclient-exit-hooks. Außerdem die Dokumentation zu dhcpclient, bootpd, ...