xmas

English version of some of this stuff

Alle Patches/Scripte/Programme, die hier herumliegen stehen mit Ausnahme von atc.tar.gz unter der GPL.

tmpfs+tar als Ersatz für Initrd

Das ganze Initrd-Geraffel ist nicht nur unhandlich, sondern spätestens seit Einführung des tmpfs auch hochgradig überflüssig. Die Idee ist ganz einfach: mounten eines leeren tmpfs als Rootfs, Auspacken eines (komprimierten) Tar-Images (das dem Kernel genau so mitgegeben wird, wie zur Zeit die Initrd) und starten von /sbin/init. Der ganze Rest (BOOTP/DHCP-Lookups, NFS-Mounts oder einfach nur das mounten des normalen Rootfilesystems) kann dann im Userspace erfolgen, also durch Scripte/Programme, die im Tar-Image liegen.

Die nächsten Schritte wären dann:

Hier ist der Patch für Linux-2.4.26: patch-2.4.26-inittar.bz2, Changelog dazu. Die meisten beim Umstieg von 2.4.18 auf 2.4.19 nötigen Änderungen stammen von David L. Parsley. Gegenüber früheren Version ist der Patch schlanker geworden, allerdings gibt es die Aufteilung von rd.c nicht mehr, d.h. eine klassische Ramdisk wird auf jedenfall mit in den Kernel gebaut.

Ältere (und neuere, wenn ich mal wieder zu faul war, diese Seite zu aktualisieren): patches.

Um Tmpfs+Inittar zu aktivieren, muß der Kernel mit CONFIG_BLK_DEV_RAM, CONFIG_BLK_DEV_INITRD, CONFIG_TMPFS und CONFIG_TMPFS_INITTAR gebaut werden. Statt der Initrd wird ihm vom Bootloader dann ein (optional komprimiertes) Tar-File übergeben. Beim booten wird erst nachgesehen, ob es sich um ein (komprimiertes) Tar-File handelt. Falls nicht, wird der normale Initrd-Code ausgeführt. Zum Mounten des tmpfs können mit "inittar=tmpfs-options" zusátzliche Optionen in der Kernel-Kommandozeile angegeben werden.

Für die 2.6er Kernel hat Ian McDonnel einen Patch erstellt, der allerdings nur mit gzip komprimierte Images unterstützt. Vielen Dank dafür an Ian. linux-2.6.10-inittar-p0.patch.bz2

Wer gerne atc(6) spielt, kann atc.tar.gz als Beispiel verwenden. Ein anderes Beispiel ist das Setup für Diskless Clients. Das ist zwar prinzipiell auch für die klassiche Initrd geeignet, aber hier funktioniert es auch als Inittar.

Ein Script zum mounten normaler Dateisysteme (von Festplatte, Floppy, ...) ist rdinit-0.9.1. Dieses Script als /sbin/init in einem inittar (oder auch einer initrd), zusammen mit den benötigen Programmen (shell und einige Standardprogramme, mount, pivot_root, ...) ermittelt anhand von /proc/sys/kernel/real-root-dev das zu mountende Device, mounted es und führt dann mehr oder weniger die übliche pivot_root(8) und chroot(8)-Logik aus. Sollte tatsächlich einmal tmpfs+inittar zwingend im Kernel enthalten sein, so daß der Kernel nicht mehr selbst "root=..." auswertet, kann das Auslesen von real-root-dev natürlich entfallen.

Neu: Inittar und bzip2-Kompression.

Auf eine Anfrage von Niklas Brunbäck habe ich Christian Ludwigs wundervollen bzip2-Patch (siehe http://shepard.kicks-ass.net/~cc/) und inittar zusammengebracht. Es ist jetzt also möglich, einen bzip2-komprimierten Kernel zusammen mit einem bzip2-komprimierten tar-File zu booten. Um einen Kernel mit bzip2 und inittar zu bauen, muß folgendermaßen vorgegangen werden:

Inittar-Announcement Mailingliste:

Es gibt jetzt auch eine Mailingliste, über die neue Versionen des Inittar-Patches angekündigt werden. Bei Bedarf kann ich diese Mailingliste auch für Diskussionen über Inittar umkonfigurieren. Zur Anmeldung muß eine Mail an <inittar-request@outback.escape.de> mit "subscribe" im Betreff geschickt werden.

Diskless Clients

Ein Versuch von mir, eine generisches Setup für Diskless Clients zu bauen, ist hier zu finden.

Shellscript zum Erstellen einer Initramdisk

Das folgende Shellscript erstellt in /var/tmp/initrd eine komplette Verzeichnishierarchie, die als Initramdisk für ein Notfallsystem verwendet werden kann. Da das Script mal eben "nebenbei" entstanden ist, muß man auf jeden Fall noch selbst Hand anlegen (Konfiguration der einzelnen Softwarepakete, Auswahl der anzulegenden Devices und der zu installierenden Module etc.). Am Besten, man liest das Script einfach mal durch, wobei es sich empfiehlt, hinten anzufangen.

Um das Script zu verwenden, müssen zunächst einige Sourcen besorgt und in einem beliebigen Verzeichnis ausgepackt werden:

In der vorliegenden Fassung ist das Script exakt auf mein System zugeschnitten, d.h. es werden z.B. nur die Devices und Module installiert, die ich selbst brauche. Vielleicht habe ich irgendwann mal Lust und Zeit, das ganze konfigurierbar zu machen.

Nachdem alle Sourcen ausgepackt sind (z.B. nach /var/tmp/sources) kann mit dem Script alles gebaut und installiert werden. Dabei wird zunächst die uClibc zusammen mit dem gcc-Wrapper gebaut und installiert (keine Angst, der Wrapper wird später wieder gelöscht und benötigt auf der fertigen Initrd keinen Platz). Anschließend folgen die restlichen Pakete, die alle gegen die uClibc gelinkt werden. Zum Schluß werden überflüssige Dateien gelöscht, einige Symlinks und Devices angelegt sowie ein paar Kernelmodule installiert. Das ganze landet dann in /var/tmp/initrd.

Das erzeugte Verzeichnis /var/tmp/initrd kann dann z.B. mit genromfs in ein romfs-Image konvertiert werden, das dann als Initrd verwendet wird. Selbstverständlich kann man auch jedes andere Filesystem verwenden, das Initrd-fähig ist (ext2, minix, mit meinem Patch weiter unten auc cramfs).

Bei meinem System (linux-2.4.5-pre1) belegt die so erzeugte und mit gzip komprimierte Initrd 675 kB und paßt bequem zusammen mit dem Kernel und einem ordentlichen Bootloader (z.B. grub) auf eine normale (1.44MB) Diskette.

Download buildinitrd.

Cramfs als Initramdisk

patch-2.4.0-mk1

Raidpatches für Kernel 2.2.18

raid-2.2.18.bz2


kili@outback.escape.de