• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] Kernel panic: VFS: Unable to mount root fs on hdb2

StephanS

Member
Hallo Leute,

nachdem ich versehentlich mit apt meinen Kernel von 2.6.5-7.111 auf 2.6.5-7.147 geupgradet habe, erhalte ich obige Fehlermeldung. Weiß jemand, wie ich wieder ein laufendes System bekomme, egal welcher Kernel?

Folgende Daten zu meinem System:
SuSE 9.1, Pentium III, mkinitrd-1.2-8, grub-0.94-25,
root Filesystem: hdb2 (ReiserFS )
/boot : hda4

Beim Update hat apt/SuSEconfig folgendes ausgegeben:

Code:
kernel-default              ##################################################
Setting up /lib/modules/2.6.5-7.147-default
Root device:	/dev/hdb2 (mounted on / as reiserfs)
Module list:	reiserfs

Kernel image:	/boot/vmlinuz-2.6.5-7.147-default
Initrd image:	/boot/initrd-2.6.5-7.147-default
Shared libs:	lib/ld-2.3.3.so lib/libc.so.6 lib/libselinux.so.1 

Modules:	kernel/drivers/scsi/scsi_mod.ko kernel/drivers/scsi/sd_mod.ko 
kernel/fs/reiserfs/reiserfs.ko kernel/drivers/pcmcia/pcmcia_core.ko kernel/drivers/pcmcia/i82092.ko kernel/drivers/block/umem.ko kernel/drivers/scsi/megaraid/megaraid_mm.ko kernel/drivers/scsi/megaraid/megaraid_mbox.ko kernel/drivers/scsi/libata.ko kernel/drivers/scsi/ata_piix.ko kernel/drivers/scsi/megaraid.ko kernel/drivers/scsi/aic7xxx/aic79xx.ko kernel/drivers/scsi/gdth.ko kernel/drivers/scsi/sata_vsc.ko kernel/drivers/char/hw_random.ko kernel/drivers/char/watchdog/i8xx_tco.ko kernel/drivers/char/agp/agpgart.ko kernel/drivers/char/agp/intel-mch-agp.ko kernel/drivers/char/agp/intel-agp.ko kernel/drivers/mtd/chips/chipreg.ko kernel/drivers/mtd/mtdcore.ko kernel/drivers/mtd/maps/pci.ko kernel/drivers/mtd/maps/ich2rom.ko kernel/drivers/net/mii.ko kernel/drivers/net/e100.ko kernel/drivers/net/e1000-new/e1000-new.ko kernel/drivers/net/eepro100.ko kernel/drivers/net/tulip/tulip.ko kernel/drivers/net/e1000/e1000.ko kernel/drivers/net/ixgb/ixgb.ko kernel/sound/soundcore.ko kernel/sound/oss/ac97_codec.ko kernel/sound/oss/i810_audio.ko kernel/sound/core/snd.ko kernel/sound/core/seq/snd-seq-device.ko kernel/sound/core/snd-rawmidi.ko kernel/sound/drivers/mpu401/snd-mpu401-uart.ko kernel/drivers/input/gameport/gameport.ko kernel/sound/core/snd-page-alloc.ko kernel/sound/core/snd-timer.ko kernel/sound/core/snd-pcm.ko kernel/sound/pci/ac97/snd-ac97-codec.ko kernel/sound/pci/snd-intel8x0.ko kernel/sound/pci/snd-intel8x0m.ko extra/hostap_old.ko kernel/drivers/base/firmware_class.ko extra/ipw2100.ko extra/slamr.ko kernel/drivers/cdrom/cdrom.ko kernel/drivers/ide/ide-cd.ko 
Including:	klibc udev
Bootsplash:	Linux-Stephan (1024x768)
Using grub, re-install of bootloader not required.

Der relevante Abschnitt aus /boot/grub/menu.lst lautet:
Code:
###Don't change this comment - YaST2 identifier: Original name: linux###
title Linux
    kernel (hd0,3)/vmlinuz root=/dev/hdb2 vga=791 splash=silent desktop resume=/dev/hdb4 showopts
    initrd (hd0,3)/initrd
Die symbolischen Links in /boot stehen auf die neue Kernelversion (einschl. initrd). Alter Kernel ist von apt/rpm gelöscht worden.

Das Filesystem auf hdb2 hab ich mit Knoppix und reiserfsck gecheckt: keine Fehler, kann ohne Weiteres gemountet werden. Ich hab auch schon versucht, mit
Code:
mkinitrd -k vmlinuz-2.6.5-7.147 -o initrd-2.6.5-7.147
eine neue initrd zu erstellen: keine Änderung. Herausnehmen der initrd-Zeile aus menu.lst: keine Änderung. Entfernen aller Bootoptionen hinter vga=791: keine Änderung.

Leider bin ich mit ähnlichen Topics im Forum nicht zurechtgekommen, weil die sich meistens auf selbstkompilierte Kernel beziehen.

Vielen Dank im Voraus!
 
OP
StephanS

StephanS

Member
Eine Idee hab ich noch:
Ich such mir das rpm vom vorigen Kernel (2.6.5-7.111), entpacke das unter Knoppix in ein temporäres Verzeichnis (wie geht der rpm-Befehl dazu genau?) und kopiere ihn dann nach /boot. Wenn alles läuft, kümmere ich mich um die rpm-db. Macht das Sinn? Was mach ich dann mit der initrd?
 
OP
StephanS

StephanS

Member
So. Bin einen kleinen Schritt weiter. Hab den Kernel of the day installiert und kann nun starten, muss aber noch irgendwie den nvidia-Grafiktreiber wieder einrichten.
Ursache für den Fehler war, dass der Standardkernel keinen Support für ReiserFS inkompiliert hat. Reiserfs muss also als Modul in die initrd. Der mkinitrd-Befehl funktioniert aber nicht mehr, sondern gibt folgende Fehlermeldungen:
Code:
Root device:	/dev/hdb2 (mounted on / as reiserfs)
Module list:	reiserfs

Kernel image:	/boot/vmlinuz-2.6.11.4-20050321160257-default
Initrd image:	/boot/initrd-2.6.11.4-20050321160257-default
cp: cannot stat `/sbin/udevstart.static': No such file or directory
Shared libs:	ldd: /sbin/udevstart.static: No such file or directory
lib/ld-2.3.3.so lib/libc.so.6 lib/libselinux.so.1 
pcilib: Cannot open /sys/bus/pci/devices
pcilib: Cannot open /sys/bus/pci/devices
Usage: hwinfo [options]
Probe for hardware.
  --short        just a short listing
  --log logfile  write info to logfile
  --debug level  set debuglevel
  --version      show libhd version
  --dump-db n    dump hardware data base, 0: external, 1: internal
  --hw_item      probe for hw_item
  hw_item is one of:
    cdrom, floppy, disk, network, gfxcard, framebuffer, monitor, camera,
    mouse, joystick, keyboard, chipcard, sound, isdn, modem, storage-ctrl,
    netcard, printer, tv, dvb, scanner, braille, sys, bios, cpu, partition,
    usb-ctrl, usb, pci, isapnp, ide, scsi, bridge, hub, memory, smp, pppoe,
    pcmcia, pcmcia-ctrl, wlan, zip, dsl, all, reallyall

  Note: debug info is shown only in the log file. (If you specify a
  log file the debug level is implicitly set to a reasonable value.)
/sbin/mkinitrd: line 1: /lib/modules/2.6.11.4-20050321160257-default/modules.pcimap: syntax error: operand expected (error token is "/lib/modules/2.6.11.4-20050321160257-default/modules.pcimap")

Modules:	kernel/drivers/scsi/scsi_mod.ko kernel/drivers/scsi/sd_mod.ko kernel/fs/reiserfs/reiserfs.ko kernel/drivers/pcmcia/pcmcia_core.ko kernel/drivers/pcmcia/rsrc_nonstatic.ko kernel/drivers/pcmcia/i82092.ko kernel/drivers/char/agp/agpgart.ko kernel/drivers/video/intelfb/intelfb.ko kernel/drivers/block/umem.ko kernel/drivers/scsi/megaraid/megaraid_mm.ko kernel/drivers/scsi/megaraid/megaraid_mbox.ko kernel/drivers/scsi/libata.ko kernel/drivers/scsi/ahci.ko kernel/drivers/scsi/ata_piix.ko kernel/drivers/scsi/megaraid.ko kernel/drivers/scsi/aic7xxx/aic79xx.ko kernel/drivers/scsi/gdth.ko kernel/drivers/scsi/sata_vsc.ko kernel/drivers/char/hw_random.ko kernel/drivers/char/watchdog/i8xx_tco.ko kernel/drivers/char/agp/intel-agp.ko kernel/drivers/mtd/chips/chipreg.ko kernel/drivers/mtd/mtdcore.ko kernel/drivers/mtd/maps/pci.ko kernel/drivers/mtd/maps/map_funcs.ko kernel/drivers/mtd/maps/ichxrom.ko kernel/drivers/net/mii.ko kernel/drivers/net/e100.ko kernel/drivers/net/eepro100.ko kernel/drivers/net/tulip/tulip.ko kernel/drivers/net/e1000/e1000.ko kernel/drivers/net/ixgb/ixgb.ko kernel/drivers/ide/ide-core.ko kernel/drivers/ide/pci/piix.ko kernel/drivers/i2c/i2c-core.ko kernel/drivers/i2c/busses/i2c-piix4.ko kernel/drivers/i2c/algos/i2c-algo-bit.ko kernel/drivers/i2c/busses/i2c-i810.ko kernel/drivers/i2c/busses/i2c-i801.ko kernel/sound/soundcore.ko kernel/sound/oss/ac97_codec.ko kernel/sound/oss/i810_audio.ko kernel/sound/core/snd-page-alloc.ko kernel/sound/core/snd.ko kernel/sound/core/snd-timer.ko kernel/sound/core/snd-pcm.ko kernel/sound/pci/ac97/snd-ac97-codec.ko kernel/sound/pci/snd-intel8x0.ko kernel/sound/pci/snd-intel8x0m.ko kernel/sound/pci/hda/snd-hda-codec.ko kernel/sound/pci/hda/snd-hda-intel.ko kernel/lib/crc-ccitt.ko extra/zaptel.ko extra/wcfxo.ko extra/ieee80211_crypt.ko extra/ieee80211.ko kernel/drivers/base/firmware_class.ko extra/ipw2200.ko extra/ipw2100.ko kernel/drivers/ide/ide-disk.ko kernel/drivers/ide/ide-floppy.ko kernel/drivers/cdrom/cdrom.ko kernel/drivers/ide/ide-cd.ko 
Including:	klibc udev
Bootsplash:	Linux-Stephan (1024x768)
chown: cannot dereference `/var/tmp/mkinitrd.t22274/mnt/sbin/udevstart': No such file or directory
Dieses udevstart.static gibt's bei mir nicht. In /sbin schaut's so aus:
Code:
-rwxr-xr-x  1 root root 55208 Jul  1  2004 udev*
-rwxr-xr-x  1 root root 96256 Jul  1  2004 udev.debug*
-rwxr-xr-x  1 root root   467 Mar 13  2004 udev.get_input_lirc.sh*
-rwxr-xr-x  1 root root  1600 May  9  2004 udev.get_persistent_device_name.sh*
-rwxr-xr-x  1 root root  8035 Jun 25  2004 udev.get_unique_drive_id.sh*
-rwxr-xr-x  1 root root 10048 Jun 28  2004 udev.get_unique_hardware_path.sh*
-rwxr-xr-x  1 root root 53812 Jul  1  2004 udev.static*
-rwxr-xr-x  1 root root 90417 Jul  1  2004 udev.static.debug*
-rwxr-xr-x  1 root root 45492 Jul  1  2004 udevinfo.static*
-rwxr-xr-x  1 root root  5604 Jul  1  2004 udevstart*
Also irgendwann möchte ich schon wieder initrd's machen können.
 
Wie wär's, wenn du alle benötigten Module einkompilierst und dir den ganzen Ärger mit der initrd sparen kannst?
 
OP
StephanS

StephanS

Member
Ansich ne gute Idee. Hab nur noch nie einen Kernel selber kompiliert und finde eigentlich die automatischen Updates mit apt ganz praktisch. Werd mich da mal einlesen. Problem ist, dass ich ja im Moment keine richtig funktionierende Ausgangskonfiguration hab. Der Kernel-of-the-day lässt mich zwar Reiserfs booten, aber mein nvidia-Treiber geht noch nicht, die Soundkarte bleibt stumm und das DSL-Modem lässt sich manchmal (selten) nicht ansprechen.

Inzwischen versuche ich die initrd wieder hinzubekommen, kann ja wohl auch nicht so schwer sein. Ich bin auch schon einen kleinen Schritt weiter:
Code:
ln -s /sbin/udev.static /sbin/udevstart.static
ln -s /sbin/hotplugeventrecorder /lib/klibc/bin/hotplugeventrecorder
beseitigt die ersten beiden Fehlermeldungen. Als nächstes kommt ein fehlerhafter Aufruf von hwinfo:
Code:
hwinfo --kernel-version 2.6.5-7.151-default --db 'pci vendor=0x8086 
                         device=0x7111 
                         subvendor=0x0  
                         subdevice=0x0 
                         revision=0x1'
der zu folgender Ausgabe führt:
Code:
Usage: hwinfo [options]
Probe for hardware.
  --short        just a short listing
...

... ich arbeite daran.
 
Also bei meiner Erstinstallation war's auch nicht gerade schwierig von der initrd wegzukommen. Defaultkonfiguration bringt SUSE auch mit, also no-prob:

# rpm2cpio kernel-source.i586.rpm | cpio -div
# cd usr/src/linux...
# make cloneconfig && make -j2 && make modules_install
# cp arch/i386/boot/bzImage /boot/GiveMeAName

/etc/lilo oder grub anpassen - fertig. Den alten lässt man (zusammen mit inird) einfach vergammeln und irgendwann löschen :p
 

Neotron

Hacker
Hallo,

mach mal ein Downgrade auf mkinitrd-1.2-4.
Nur so ne "Vermutung".

Mit mkinitrd hatte ich gestern schon großen Ärger und so richtig rund lief's mit der 1.2-4
 
OP
StephanS

StephanS

Member
Danke für die Hinweise.
Nach dem Downgrade auf mkinitrd-1.2-4 läuft der Befehl
Code:
mkinitrd -k ... -i ...
zwar fehlerlos durch, aber der PC bootet immer noch nicht richtig (Fehlermeldung jetzt
Code:
Waiting for /dev/hdb2 to appear ...
und dann kommt eine abgespeckte Shell).
Gerade läuft das make für einen eigenen Kernel, basierend auf SuSE's 2.6.5-7.151-default.
 
OP
StephanS

StephanS

Member
Neuester Stand: Ich habe drei Kernel installiert.
1. 2.6.5 von SuSE
2. 2.6.5 selbstgebaut mit reiserfs fest einkompiliert (danke jengelh)
3. 2.6.11 kernel-of-the-day rpm

Nr. 3 bootet ordentlich hoch, aber hat ein paar Macken mit Sound und USB.

Nrn. 1 und 2 haben eine Initrd (erstellt mit mkinitrd-1.2-4 - danke Neotron). Der Bootvorgang ist leider unterbrochen:
Code:
RAMDISK: Compressed image found at block 0
VFS: Mounted root (ext2 filesystem).    <-- das ist wohl das initrd-FS
Starting udev
Creating devices
Loading kernel/fs/reiserfs/reiserfs.ko
Waiting for device /dev/hdb2 to appear: ... not found -- device nodes:
console fb0 null ram0 ram1 ram2 shm tty1 tty2 zero
No root device found: exiting to /bin/sh
Diese initrd-Shell beendet man mit Strg-D und dann bootet er anstandslos weiter, wobei er als erstes /dev/hdb2 mit ReiserFS 3.6 mountet.
Irgendwas ist also noch nicht ganz perfekt mit der initrd, aber damit kann ich gut leben. Sound, USB, DSL-Modem, subfs, nVidia-Treiber funktionieren.
Jetzt hab ich ja ein laufendes System, der Kernel und seine initrd sind sicherheitshalber kopiert, und die ganze /boot-Partition ist in mein tägliches Backup eingeschlossen. Und wenn ich mal Zeit hab, dann kümmere ich mich um einen aktuellen, selbstgebauten Kernel, der die initrd nicht mehr braucht.
 
OP
StephanS

StephanS

Member
Inzwischen habe ich deinen Vorschlag befolgt und mkinitrd auf verschiedene Arten ausgefuehrt: manuell ohne Argumente, manuell mit -k und -i, automatisch ueber apt/SuSEconfig. In allen Faellen komme ich nur mit Strg-D weiter.
Ich hab auch mal ein bisschen nachgelesen. Da gibt es wohl in der initrd ein Skript linuxrc, das die Module laedt und sich dann beenden soll. Danach soll der Kernel das normale / Dateisystem von hdb2 mounten. Stattdessen startet linuxrc eine Shell, weil es ueberfluessigerweise auf irgendwas wartet. Da diese linuxrc nur ein Skript ist, werd' ich das schon von Hand so hinbiegen koennen, dass da keine Shell kommt. Irgendwo hab ich auch gelesen, wie ich in die initrd rein komm, also werd' ich das probieren. Muss dann halt nur dafuer sorgen, dass das von mkinitrd nicht wieder ueberschrieben wird.
Ist aber momentan nicht mehr ganz oben auf der Prioritaetenliste fuer meine Freizeit (die Bremsen an meiner Vespa sind mir wichtiger).
 
OP
StephanS

StephanS

Member
Problem gelöst.

Das Skript "linuxrc" in der initrd enthält folgende Passage:
Code:
udev_discover_root() {
    local root
    case "$rootdev" in
	/dev/nfs) root= ;;
	/dev/*)	root=${rootdev#/dev/} ;;
    esac
    # Waits for the resume device to appear
    if [ -n "$resume_mode" ]; then
	resume=${resumedev#/dev/}
	if udev_wait_for_device $resume; then
	    path=$(udevinfo -q path -n $resume)
	    set -- $(udev_read_devn $path)
	    if [ -n "$1" ]; then
		devn=$1
		major=$2
		minor=$3
		echo "$major:$minor" > /sys/power/resume
		devn=
	    fi
	    path=
	else
	    echo " not found (ignoring)"
	fi
    fi
    if udev_wait_for_device $root; then
	path=$(udevinfo -q path -n $root)
	set -- $(udev_read_devn $path)
	if [ -n "$1" ]; then
	    devn=$1
	    major=$2
	    minor=$3
	else
	    echo " not found"
	fi
    fi
    if [ -n "$devn" ]; then
	echo "rootfs: $entry major=$major minor=$minor" \
	    "devn=$devn"
	echo $devn > /proc/sys/kernel/real-root-dev
	return 0
    else
	return 1
    fi
}

# Default timeout is 5 seconds
udev_timeout=5
# Override timeout from commandline
for o in $(cat /proc/cmdline); do
    case $o in
    udev_timeout=*)
	set -- $(IFS== ; echo $o)
	udev_timeout=$2
	;;
    esac
done

if ! udev_discover_root ; then
    echo "not found -- device nodes:"
    cd /dev
    for dev in *; do
	if [ -e "$dev" ]; then
	    echo -n "$dev "
	fi
    done
    echo ""
    echo "No root device found; exiting to /bin/sh"
    cd /
    PATH=$PATH PS1='$ ' /bin/sh
fi

die 0
Ich habe einfach die Zeile mit /bin/sh auskommentiert. Jetzt geht's. Wie gesagt kompilier ich mir demnächst in Ruhe einen 2.6.11-Kernel laut Anleitung im Forum, der ReiserFS fest eingebaut hat, sodass ich keine initrd mehr brauche.

Danke an alle.

Thema kann als "gelöst" markiert werden.
 
Oben