Home
Über die LugBE | Mailing List | Treff & Events | Projekte | lost+found | Support

Initial RAMdisk Mini-Howto

1) Einleitung, Allgemeines
2) FAQ (ein paar dumme Fragen ;-)
3) Howto (am Beispiel von ips.o)

Einleitung, Allgemeines

Müssen vor dem Start des init-Prozesses (also auch vor dem Mounten der Platten) schon Kommandos ausgeführt werden (z.B. um bestimmte Module zu laden, Parameter zu setzen...), braucht man meist eine initial ramdisk. Dieses spezielle Image-File enthält ein Mini-Dateisystem (heute meist ext2, früher Minix), das die benötigten Binaries und Devices für die Ausführung der Kommandos enthält. Grundsätzlich kann das jedes Programm sein, zu beachten ist aber, dass der ld (zum dynamischen Dazulinken von shared libraries) in dieser Phase des Bootvorganges noch nicht zur Verfügung steht; die Programme müssen daher statisch gelinkt sein.

Der Kernel mounted die RAMdisk (oder initrd) über ein spezielles Device (/dev/ram) beim Booten, wenn ihn der LILO dazu auffordert. (Der Kernel muss dazu mit CONFIG_BLK_DEV_INITRD=y übersetzt worden sein.) Findet er alle nötigen Files und Devices, führt der Kernel daraufhin die Datei /linuxrc aus, die dann die nötigen Kommandos absetzt.

FAQ

Wann braucht man das?
eine ramdisk wird noch vor dem mounten des root filesystems gemountet und das linuxrc script ausgeführt. wer treiber laden muss oder sonstwas am kernel einstellen, das früher beginnen muss als der init das system einrichtet (sprich / wird gemountet), ist mit einer ramdisk gut beraten.
das beispiel bezieht sich auf einen treiber (LKM, linux [loadable] kernel module) für einen RAID controller, auf dem das root filesystem liegt. der treiber ist binary-only und kann deswegen nicht fix in den kernel kompiliert werden. da man den treiber nicht von der harddisk laden kann, da zu diesem zeitpunkt die HD noch gar nicht gemountet ist, muss man ein image einrichten, das der kernel automatisch lädt und ausführt. danach hat man einen eingerichteten treiber um / zu mounten.

Wie läft jetzt der Boot-Prozess ab?
normaler kernel boot und initialisierung. ramdisk initialsieren, image in's RAM mounten und /linuxrc (auf der RD) ausführen.
wenn linuxrc beendet ist, boot prozess mit mounten des root-filesystems weiterfahren und init starten.

Was tut die ramdisk dabei?
ein komprimiertes (gzip) image mit einem ext2 filesystem in's RAM mounten. ramdisk als device ist über /dev/ram? ansprechbar. nach dem mounten, ist die ramdisk temporär ein root-filesystem.

Wie kann der LILO Kernel und Ramdisk von der Platte laden, bevor (bei einem RAID-System) der
  Treiber für den Controller geladen ist?

der kernel und lilo kann die hd schon ansprechen. auch filesystem support ist zu diesem zeitpunkt schon geladen. nur von einem VFS (virtual file system) layer hat er noch keine ahnung.
der lilo lädt vor dem kernel die datei /boot/map (das macht er direkt über LBA / C/H/S adressierung). dort steht der ort wo der kernel auf der festplatte gespeichert ist.
in der nächsten stage lädt der lilo den kernel. wenn der kernel fertig ist (bis zur ramdisk) nimmt er den parameter von lilo entgegen, wo auf der festplatte das ramdisk-image (meistens in /boot) gespeichert ist.
auch der RAID controller hat ein BIOS. über's RAID BIOS sind die platten wie eine ansprechbar.
das RAID BIOS übernimmt die software interuppts und API vom normalen BIOS. damit kann man auch z.b. unter DOS die platten ansprechen (oder eben der LILO)
der bootloader und der kernel merken das nicht, wenn man über die BIOS funktionen die (virtuelle) HD anspricht.
stirbt die erste platte im array, bootet die kiste nicht mehr von platte. oder?
nein. ich hab zu jedem zeitpunkt das array so angesprochen, dass der kernel und der lilo gar nicht merkten, dass das mehrere platten sind.
für den kernel ist das einfach /dev/sda1 und sda2 (swap). fertig. ob das nun ein RAID oder ein normaler controller ist, erledigt nach der bootstage beim mounten der geräte treiber. ansprechen kann man sie wie normale scsi disks.
ist eben der vorteil eines hardware RAIDs. da bekommt der bootloader und das betriebssystem gar nix mit. managen kann ich das immer noch über spez. software (booten) oder mit spez. linux software die's von IBM gibt.

The Howto itself

[...]

Zusätzlich muss noch eine RAM Disk mit dem Serveraid Treiber min. 4.40
erstellt werden. Der Treiber findet sich unter
ftp://ftp.suse.com/pub/suse_update/7.0/kernel/ips-4.40/

Nachdem der Treiber runtergeladen wurde, muss im Kernel eim RAMDisk mit
minimum von 900KB vorhanden sein. Der Standard von 4MB ist in Ordnung.

mke2fs -m0 /dev/ram 8192
mount -t ext2 /dev/ram /mnt

Folgende Dateien müssen nach /mnt (in die Ramdisk) kopiert werden:

/mnt/bin/insmod -> insmod Befehl für's laden des Treibers. Muss statisch
gelinkt sein!

/mnt/bin/sh -> shell für linuxrc script. Muss statisch gelinkt sein!

/mnt/dev/ -> mit mknod erstellen.

crw-r--r-- 1 root root 5, 1 Feb 8 16:32 console
crw-r--r-- 1 root root 29, 0 Feb 8 16:33 fb0
crw-rw-rw- 1 root root 1, 3 Feb 8 16:33 null
lrwxrwxrwx 1 root root 4 Feb 8 16:36 ram -> ram0
brw-r--r-- 1 root root 1, 0 Feb 8 16:33 ram0
brw-r--r-- 1 root root 1, 1 Feb 8 16:33 ram1
brw-r--r-- 1 root root 1, 2 Feb 8 16:33 ram2
lrwxrwxrwx 1 root root 4 Feb 8 16:36 ramdisk -> ram0
crw-r--r-- 1 root root 4, 1 Feb 8 16:33 tty1
crw-r--r-- 1 root root 4, 2 Feb 8 16:33 tty2
crw-rw-rw- 1 root root 1, 5 Feb 8 16:33 zero

/mnt/lib/ips.o
-> der eigentliche Serveraid Treiber.

/mnt/linuxrc -> das Startscript das von der Ramdisk ausgeführt wird.

In linuxrc:

#! /bin/sh

/bin/insmod -f /lib/ips.o

Weiter mit:

umount /mnt
dd if=/dev/ram of=initrd count=800 bs=1024

Die erstellte Ramdisk nach /boot kopieren. Dort mittels gzip
komprimieren.

Bei LILO unter den images noch initrd=/boot/initrd.gz

lilo neu starten!


Webmaster at lugbe.ch

Die Artikel dieser Seite stehen unter Copyleft ihrer jeweiligen Autoren. Ihre Nutzung, Wiedergabe etc. untersteht den Bedingungen der GNU Free Documentation License (http://www.gnu.org/copyleft/fdl.html), wo nicht explizit anders vermerkt.