PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Raid treiber vor /dev laden



1200
25.07.05, 16:51
Hallo zusammen,

ich hab vor Linux auf einer Hardware Raid array (PCI-Karte) zu installieren. Gentoo und Grub sind bereits installiert und der Raid treiber (hpt374.ko) ist kompilliret und funktioniert auch (modprobe hpt374).

Mein Problem ist, das man den Raid treiber nicht durch die Runlevels laden lassen kann (wie z.B. Netzwerktreiber) denn dann wurde bereits versucht die fstab zu mounten.
Da der Treiber nicht in der kernel-source vorhanden ist, hab ich nur ein modul das ich (wie ich gelesen habe) über die initrd laden lassen kann und genau an diesem punk komm ich nicht mehr weiter!

Ich habe betreits versucht die von genkernel erstelle initramfs zu entpack und den Treiber von hand einzufügen, hat aber nicht funktioniert.

Die 2. möglichkeit die ich gefunden habe ist über mkinitrd:

mkinitrd --preload hpt374 /boot/initrd-<kernel>.img <kernel>

(ich benutze <kernel> um die übersichtlichkeit zu verbessern)

Als meldung kommt :


No module hpt374 found for kernel <kernel>, aborting.


Die 3. möglichkeit die ich gefunden habe ist das modul in
/usr/share/genkernel/x86/modules_load
einzutragen , dort sind auch die sata Treiber die beim Start geladen werden, aber auch das funktioniert nicht.

Ich denke das noch etwas mit /lib/modules/... nicht stimmt, aber ich weiß nicht wie ich das testen kann.

Vielleicht weiß ja jemand was ich tun kann um den Treiber endlich geladen zu bekommen.

MfG Mazze

suck
25.07.05, 17:12
Um von dem Raid zu booten, gibt es tatsächlich nur die Möglichkeit den Treiber fest im Kernel zu haben (was ja nicht geht) oder eben indirekt zu booten. Das geht wie folgt:

- Beim Booten wird anstatt des Raids eine Ramdisk geladen (Ramdisk support muss fest im Kernel einkompiliert sein), und nicht dein Raid. Das Verzeichnis "/" wird auf die Ramdisk gemountet.

- In dieser Ramdisk läuft sowas wie ein Mini-Linux, dass diverse Augaben durchführt (mitunter das Laden des Moduls für den Raid) und dann das normale System auf dem Raid bootet.

Das ganze löst man üblicherweise mit der initrd (Initial RamDisk). Man erstellt ganz normal eine Ramdisk, erstellt ein ext2 Dateisystem in der Ramdisk und mountet sie z.B. nach /mnt/ramdisk. Dann kopiert man sein Minilinux nach /mnt/ramdisk. Das Minilinux beinhaltet mitunter die Datei (/mnt/ramdisk)/linuxrc (das Startscript). Ist alles fertig packt man das gesamte Verzeichnis /mnt/ramdisk (bzw. ein Image davon, welches man mit dd erstellt) in eine Datei initrd.gz. Neulich hab im Kernel aber was neues entdeckt, es nennt sich initramfs. Dies ist wohl die neuere Art sowas zu erledigen. Infos findest du in den Kernelquellen im Verzeichnis Dokumentation/early-userspace/.

Sollte deine Distri schon mit einer initrd oder initramfs daherkommen, ist es wohl einfacher diese anzupassen. Das Erstellen meiner ersten eigenen initrd (hat das selbe mit NFS gemacht, was du mit dem Raid vor hast) hat mich 3 Tage und etliche Nerven gekostet (ich musste aber auch lilo nehmen, da ich von Diskette booten musste und es keine Festplatten gab).

Gruss..

x86-64
25.07.05, 17:13
Vergiss es !!!

Ich hatte auch so ein Teil (rocketraid 1640 - hpt374) und hab mir an dem ****** teil die zähne ausgebissen. Als er dann ab kernelversion 2.6.10 mir in schöner regelmässigkeit beim modul laden das array zerlegt hat wars mir zu blöd des ding ist bei ebay gelandet.

zu den möglichkeiten die einzig wo funktionieren kann ist die mit der initrd ramdisk bzw dem kernelmodul welches kein raid kann.

dazu hab ich das modul kompilier unter /lib/modules/<kernel>/kernel ein verziechniss hpt374 angelegt dort des ganz zeugs reinkompliert und dann mit depmod oderso das verzichniss scannen gelassen und dann hat des mit mkinitrd geklappt bloss kam beim anschließenden booten ein fehler init not found oder so und des wars dann.

ich hab mir nach dem ganzen theater eine softwareraid angelegt und des lauft um einiges besser als der highpoint controller

wenn ihr mal nach dem ding suchst wirst auf einige threads von mir stossen wo des problem genauer erläutert ist:

http://www.linuxforen.de/forums/showthread.php?t=164705&highlight=hpt374
http://www.linuxforen.de/forums/showthread.php?t=183523&highlight=hpt374

WFlyer
25.07.05, 18:43
Hm .. die Treiber sind doch in den sourcen drinne habe hier gerade nachgeschaut , unter

Device Drivers -->>> ATA/ATAPI/MFM/RLL support --->>> PCI IDE chipset support aktivieren ->>>> HPT36X/37X chipset support.

Info : PT366 is an Ultra DMA chipset for ATA-66. │
│ HPT368 is an Ultra DMA chipset for ATA-66 RAID Based. │
│ HPT370 is an Ultra DMA chipset for ATA-100. │
│ HPT372 is an Ultra DMA chipset for ATA-100. │
│ HPT374 is an Ultra DMA chipset for ATA-100. │
│ │
│ This driver adds up to 4 more EIDE devices sharing a single │
│ interrupt.


Kannste also fest im Kernel backen und brauchste keine initrd verwenden, damit sollte das Prob beseitigt sein .

1200
25.07.05, 22:43
Also erst mal danke für die schnellen antworten!

@ suck : Danke, jetzt weiß ich wenigstens das ich auf dem richigen weg war/bin und wo ich was drüber finden kann.

@ x86-64 : Ich habe den 454 und nicht den 1640, ich denke das wird schon was ausmachen, zudem wurde in den letzten 1-3 (hab den genauen Zeitpunkt nicht mitbekommen) Monaten eine neu treiber source-version released (2.13) und ich habe irgendwas zwischen 6 und 9 verschieden kernel-sourcen, sprich verschieden "kernel-distributoren" sowie versionen von 2.6.7 bis 2.6.13_rc3 war alles dabei, ausprobiert bis ich rausgefunden hatte, das der treiber nicht mit kernel versionen von 2.6.10 aufwärts funktioniert ! (Ja, ich benutzte den 2.6.9-r9 kernel).
Vielleicht hast du nur ne "schlechte" version gehabt ?!
Das mit dem Sw Raid fällt für mich flach, da ich 4 platten und 2 Laufwerke drinn hab.

@ WFlyer : ich muss ganz ehrlich zugeben, das ich das garnicht versucht habe, da ich bisher überall im Inet gelesen hab, das man diese deaktivireren muss um den Controller zum laufen zu bringen.

Ich werde also erst mal das mit dem In-Kernel modul versuchen und sollte das nicht klappen werd ich mich wieder auf die such nach initramfs machen!

Gruß und nochmla danke

Mazze

1200
26.07.05, 00:03
Nochmal ne frage, wenn ich den Treiber in den Kern Kompilliert hab, muss ich dann noch irgendwo was eintragen das der auch geladen wird bzw. das beim booten nach diesem Gerät gesucht wird oder ähnliches ?
Wenn nein, geht es nicht mit dem Treiber den die Source (2.6.12-r6) mitbringt.

Zudem ist mir gerade was zu der Bootreihenfolge aufgefallen :
- In-Kernel module
- uDev
- root device
- initramfs
- rest ...

Wenn das ramfs geladen wird, sollte die root partition schon gemountet sein ... das ist ein problem, denn die root partition soll ja auf dem Raid liegen ;-)

Jemand ne idee was man da machen kann ?
(/dev/ram0 will er nicht als root, hab ich schon ausprobiert!)

MfG Mazze

x86-64
26.07.05, 12:24
@ x86-64 : Ich habe den 454 und nicht den 1640, ich denke das wird schon was ausmachen, zudem wurde in den letzten 1-3 (hab den genauen Zeitpunkt nicht mitbekommen) Monaten eine neu treiber source-version released (2.13) und ich habe irgendwas zwischen 6 und 9 verschieden kernel-sourcen, sprich verschieden "kernel-distributoren" sowie versionen von 2.6.7 bis 2.6.13_rc3 war alles dabei, ausprobiert bis ich rausgefunden hatte, das der treiber nicht mit kernel versionen von 2.6.10 aufwärts funktioniert ! (Ja, ich benutzte den 2.6.9-r9 kernel).
Vielleicht hast du nur ne "schlechte" version gehabt ?!
Das mit dem Sw Raid fällt für mich flach, da ich 4 platten und 2 Laufwerke drinn hab.



also zu dem kernel treiber wo WFlyer kann ich nur sagen dass ding lauft unterstützt aber nur einzeln angeschlossene geräte also erkennt kein raid arrays

zu den treiberversionen:
2.12 lies sich bei mir ab 2.6.10 gar nicht übersetzten bzw nur mit einem "hack patch"
2.13 hat mir egal mit elchem kernel immer das raid 5 zerlegt - ich hab des mindesten 10 x probiert

zu hw der rocketraid 454 hat genau den gleichen chip wie der 1640 nur hängenbeim 1640 noch ide-sata brücken vor dem controller damit man sata laufwerke anschliessen kann

die initrd wird auf jedemfall vor dem rootdevices geladen



im notfall könntest du den controller mit dem kernelmodul betreiben und dann darauf eine software raid aufsetzen

1200
26.07.05, 13:56
die initrd wird auf jedemfall vor dem rootdevices geladen

Ich tippe jetzt mal schnell ab was beim booten geschreiben wird:

- Zuerst werden jede menge geräte erkann z.B. Festplatten usw.
- "Loading Modules" jetzt lädt er usb-storage, ieee1394, sata_nv usw. die
module aus dem Kern eben
- "Activating udev"
- "Determing root device ..."
- "Mounting root ..."
- "Booting (initramfs) ......."

und genau hier ist das problem. Lädt der die Initrd anderst als ein initramfs ? (laut beschreibung sollten die beiden ziemlich ähnlich sein)

Gruß Mazze

1200
26.07.05, 14:14
So, ich hab jetzt meinen anderen Linux-Rechner mal neugestartet und mir is dabei aufgefallen, das es dort ein bisschen anderst abläuft :

- Wieder diese Geräte wie Festplatte usw.
- ACPI ...
- RAMDISK : Compressed image found at block 0
- VFS : Mounted root (ext2 filesystem) readonly
- Freeing unused kernel memory
- Loading modules

Ab da geht es wie beim Problemrechner weiter.

Der andere Rechner hat aber eine initrd und kein initramfs, ich weiß jetzt aber nicht was das ändert, denn es sind beide im Grub eingetragen.

Gruß Mazze

1200
28.07.05, 14:54
Also gut, ich bin in letzter Zeit viel weiter gekommen, ich habe mir eine eigene initrd erstellt, mit alles treiber, libs und Programmen drauf die man so am anfang braucht.

Hab dem grub mitgeteilt er soll den kernel mit "init=/linuxrc" starten und auch die ramdisk angegenben. Er lädt auch die rd, lädt den Raid treiber, aber er mountet die platte nicht nach / und wenn dann "exit" ausgeführt wird (in der linuxrc) hängt er sich auf mit der meldung


Kernel panic - not syncing: Attempted to kill init

hat jemand ne idee was ich falsch / vergessen habe ?

Gruß Mazze

1200
06.08.05, 14:45
Also, das Problem ist gelöst und ich schreibe jetzt mal wie ich das gemacht habe, vielleicht kanns ja jemand mal brauchen!

Problem: Gentoo (oder auch ein anderes Linux) auf einem Rechner mit einer Raid/SCSI karte für welche man den treiber selbst Kompillieren muss.

Lösung :

anmerkung : Ich habe das Gentoo zuerst auf eine IDE platte gemacht, da ich recht lange gebraucht habe bis es gelaufen ist und das währe von der LiveCD aus sehr unangenehm geworden, jedoch glaube ich das es mit dieser anleitung durchaus möglich sein sollte dies von liveCD aus zu schaffen!

Als erste muss man die LiveCD Booten und den treiber für die Raidkarte kompillieren und per modprobe / insmod laden.


insmod /root/hpt374/hpt374.ko

Meine Raid arrey ist nun unter /dev/sda zu erreichen.
Nun habe ich wie in der anleitung beschrieben diese partitionen nach /mnt/gentoo /mnt/gentoo/boot usw. gemountet, darauf Gentoo installiert und per


chroot /mnt/gentoo /bin/bash

auf diese gewechselt und Gentoo fertig installiert.
Nun muss man den treiber erneut für diesen kern kompillieren.

Als nächstes muss die initramfs erstellt werden (early-userspace)


dd if=/dev/zero of=/boot/initramfs.img count=5120 bs=1024

Die Ramdisk wird nun 5 Mb groß, das müsste reichen.
Diese muss jetzt noch formatiert werden


mke2fs -i 1024 -b 1024 -m 5 -F -v /boot/initramfs.img

Dieses Image lässt sich jetzt als loop device mounten und beschreiben


mkdir /initramfs.d
mount /boot/initramfs.img /initramfs.d -t ext2 -o loop
cd /initramfs.d

nun müssen noch diese Dateien und Verzeichnisse in die RamDisk

total 23
drwxr-xr-x 2 root root 1024 Aug 6 03:42 bin
drwxr-xr-x 2 root root 1024 Jul 28 16:09 dev
drwxr-xr-x 2 root root 1024 Aug 6 02:58 etc
drwxr-xr-x 2 root root 1024 Aug 6 16:04 lib
-rwxrwxrwx 1 root root 947 Aug 6 16:03 linuxrc
drwxr-xr-x 2 root root 1024 Aug 6 14:31 mnt
drwxr-xr-x 2 root root 1024 Jul 29 16:39 old-root
drwxr-xr-x 2 root root 1024 Jul 27 16:46 proc

./bin:
total 678
-rwxr-xr-x 1 root root 539332 Jul 27 16:46 bash
-rwxr-xr-x 1 root root 15152 Aug 6 03:42 cat
-rwxr-xr-x 1 root root 12364 Jul 28 17:21 chroot
-rwxr-xr-x 1 root root 6776 Jul 28 15:14 insmod
-rwxr-xr-x 1 root root 9624 Jul 27 16:46 losetup
-rwx--x--x 1 root root 53700 Jul 27 16:46 mount
-rwxr-xr-x 1 root root 3460 Jul 29 16:03 pivot_root
lrwxrwxrwx 1 root root 6 Jul 27 16:46 sh -> ./bash
-rwxr-xr-x 1 root root 13692 Aug 6 03:27 sleep
-rwx--x--x 1 root root 26316 Jul 28 16:43 umount

./dev:
total 0
crw-r--r-- 1 root root 5, 1 Jul 28 16:09 console
brw-rw-rw- 1 root root 3, 0 Jul 28 15:38 hda
brw-rw-rw- 1 root root 3, 1 Jul 28 15:38 hda1
brw-rw-rw- 1 root root 3, 2 Jul 28 15:39 hda2
brw-rw-rw- 1 root root 3, 3 Jul 28 15:39 hda3
brw-rw-rw- 1 root root 3, 4 Jul 28 15:39 hda4
brw-rw-rw- 1 root root 3, 5 Jul 28 15:39 hda5
brw-rw-rw- 1 root root 3, 6 Jul 28 15:39 hda6
brw-rw-rw- 1 root root 3, 7 Jul 28 15:39 hda7
brw-rw-rw- 1 root root 3, 8 Jul 28 15:39 hda8
brw-r----- 1 root root 7, 0 Jul 28 15:45 loop0
brw-r----- 1 root root 7, 1 Jul 28 15:45 loop1
crw-rw-rw- 1 root root 1, 3 Jul 28 15:36 null
brw-rw-rw- 1 root root 8, 0 Jul 28 15:39 sda
brw-rw-rw- 1 root root 8, 1 Jul 28 15:39 sda1
brw-rw-rw- 1 root root 8, 2 Jul 28 15:39 sda2
brw-rw-rw- 1 root root 8, 3 Jul 28 15:39 sda3
brw-rw-rw- 1 root root 8, 4 Jul 28 15:39 sda4
brw-rw-rw- 1 root root 8, 5 Jul 28 15:40 sda5
brw-rw-rw- 1 root root 8, 6 Jul 28 15:40 sda6
brw-rw-rw- 1 root root 8, 7 Jul 28 15:40 sda7
brw-rw-rw- 1 root root 8, 8 Jul 28 15:40 sda8
crw-rw---- 1 root root 5, 0 Jul 28 15:35 tty
crw------- 1 root root 4, 1 Jul 28 15:42 tty1
crw-r--r-- 1 root root 1, 5 Jul 28 15:36 zero

./etc:
total 12
-rw-r--r-- 1 root root 1245 Aug 6 02:58 fstab
-rw-r--r-- 1 root root 8436 Jul 27 16:46 ld.so.cache
-rw-r--r-- 1 root root 115 Jul 28 17:50 mtab

./lib:
total 1836
-rw-r--r-- 1 root root 117411 Jul 28 15:09 hpt374.ko
-rwxr-xr-x 1 root root 99488 Jul 27 16:46 ld-2.3.4.so
lrwxrwxrwx 1 root root 11 Jul 27 16:46 ld-linux.so.2 -> ld-2.3.4.so
lrwxrwxrwx 1 root root 15 Jul 28 16:36 libblkid.so.1 -> libblkid.so.1.0
-rwxr-xr-x 1 root root 21340 Jul 28 16:36 libblkid.so.1.0
-rwxr-xr-x 1 root root 1204672 Jul 27 16:48 libc-2.3.4.so
lrwxrwxrwx 1 root root 13 Jul 27 16:49 libc.so.6 -> libc-2.3.4.so
-rwxr-xr-x 1 root root 10624 Jul 28 16:17 libdl-2.3.4.so
lrwxrwxrwx 1 root root 14 Jul 28 16:25 libdl.so.2 -> libdl-2.3.4.so
-rwxr-xr-x 1 root root 155992 Aug 6 03:34 libm-2.3.4.so
lrwxrwxrwx 1 root root 13 Aug 6 03:35 libm.so.6 -> libm-2.3.4.so
-rwxr-xr-x 1 root root 147960 Aug 6 15:11 libpthread-0.10.so
lrwxrwxrwx 1 root root 18 Aug 6 15:12 libpthread.so.0 -> libpthread-0.10.so
-rwxr-xr-x 1 root root 37636 Aug 6 14:38 librt-2.3.4.so
lrwxrwxrwx 1 root root 14 Aug 6 14:39 librt.so.1 -> librt-2.3.4.so
lrwxrwxrwx 1 root root 14 Jul 28 16:50 libuuid.so.1 -> libuuid.so.1.2
-rwxr-xr-x 1 root root 8852 Jul 28 16:50 libuuid.so.1.2
lrwxrwxrwx 1 root root 13 Jul 28 16:35 libz.so.1 -> libz.so.1.2.2
-rwxr-xr-x 1 root root 58204 Jul 28 16:34 libz.so.1.2.2

./mnt:
total 0

./old-root:
total 0

./proc:
total 0

Die Beötigten Programme und libs findet man in der auf der Festplatte unter /bin /sbin und /lib (nicht vergessen die liebs zu verlinken!). Die Datei hpt374.ko muss durch euren treiber ersetzt werden und das verzeichniss old-root muss auch auf der Festplatte vorhanden sein.
Auch die 3 dateien aus /etc werden aus dem gleichnamigen verzeichniss auf der Festplatte kopiert.
Ledeglich die devices in /dev sind etwas schwieriger, diese müssen mit mknod erstellt werden


cd /initramfs.d/dev
mknod console c 5 1
mknod hda b 3 0
mknod hda1 b 3 1
mknod hda2 b 3 2
mknod hda3 b 3 3
... usw.
mknod loop0 b 7 0
mknod loop1 b 7 1
mknod null c 1 3
mknod sda b 8 0
mknod sda1 b 8 1
mknod sda2 b 8 2
... usw.
mknod tty c 4 0
mknod tty1 c 4 1
mknod zero c 1 5


Wenn das geschafft ist, wird noch die datei /initramfs.d/linuxrc angelegt. Dies muss auch dem Bootloader mitgeteilt werden, aber dazu später.

Der inhalt der linuxrc sieht bei mir so aus


#!/bin/bash
insmod /lib/hpt374.ko
mount -t reiserfs /dev/sda3 /mnt
pivot_root /mnt /mnt/old-root
mount -n -t proc proc /proc
echo "0x0100" > /proc/sys/kernel/real-root-dev
umount /proc


Soweit so gut, die RamDisk ist fertig! jetzt muss man sie noch umounten


umount /initramfs.d

Jetzt muss nurnoch der bootloader configuriert werden, in meinem fall ist das grub, die menu.lst müsste dann in etwa so aussehen


default 0
timeout 5

title=Gentoo Linux on Raid
root (hd0,0)
kernel (hd0,0)/kernel-2.6.9 root=/dev/sda3 init=linuxrc usw.
initrd (hd0,0)/initramfs.img

Ich hoffe das diese anleitung andere davor bewahrt sich 2 wochenlang mit diesem Thema rumzuschlagen !

MfG Mazze