SuSE Linux vom USB-Stick starten/Rescuesystem

R

Ravetracer

Hallo.
Ich möchte ein SuSE-Rescuesystem von einem USB-Stick starten.
Bis jetzt habe ich das System soweit gebracht, dass der Stick startet,
eine Ramdisk erzeugt wird und ein Image darin gemountet wird.
Ich bekomme aber immer wieder eine Fehlermeldung:

Kernel Panic: VFS unable to mount rootfs on /dev/sda1

Nun gut, auf sda1 befindet sich ja lediglich Grub, der Kernel und das Rescue-
Image von SuSE.

Ich möchte, dass beim Start das Rescue-Image komplett in den Speicher
geladen wird und von dort aus ausgeführt wird. Da USB-Sticks ja keine
unendliche Lebensdauer haben, möchte ich diesen schonenden Vorgang
benutzen.

Wie müsste ich nun die Linuxrc umschreiben, damit der Kernel weiß, dass
entweder das rootfs schon gemountet ist, oder dass er das rootfs aus der
Ramdisk mounten soll?

Hier meine "linuxrc"
#! /bin/sh

export PATH=/sbin:/bin:/usr/bin

mount -n -tproc proc /proc
mount -n -tsysfs sysfs /sys > /dev/null 2>&1

die() {
umount -n /proc
umount -n /sys
exit $1
}

# Fallback root device number
rootdevn=770

set -- $(cat /proc/cmdline)
while [ $# -gt 1 ]; do
case $1 in
root=*)
set -- $(IFS== ; echo $1)
rootdev=$2
rootdev_cmdline=1
break ;;
esac
shift
done
if [ -z "$rootdev" ]; then
rootdev=/dev/sda1
fi

mkdevn ()
{
local major=$1 minor=$2;
expr '(' $minor % 256 ')' + '(' $major '*' 256 ')' + '(' '(' $minor / 256 ')' '*' 256 '*' 4096 ')'
}

devmajor ()
{
local devn=$1;
expr '(' $devn / 256 ')' % 4096
}

block_driver ()
{
local devn block major driver;
case "$1" in
/dev/*)
devn=$(devnumber $1 2> /dev/null)
;;
*:*)
set -- $(IFS=: ; echo $1);
devn=$(mkdevn $1 $2)
;;
[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F])
devn=$((0x$1))
;;
esac;
[ -z "$devn" ] && return 1;
while read major driver; do
[ "$major" = Block ] && block=1;
[ -z "$driver" -o -z "$block" ] && continue;
if [ $(devmajor $devn) = $major ]; then
echo $driver;
return 0;
fi;
done </proc/devices;
return 1
}


echo "Starting udev"
echo "/sbin/udev" > /proc/sys/kernel/hotplug
echo "Creating devices"
UDEVSTART_ON_BOOT=1
export UDEVSTART_ON_BOOT
/sbin/udevstart

# check for SCSI parameters in /proc/cmdline
for p in $(cat /proc/cmdline) ; do
case $p in
scsi*|*_scsi_*|llun_blklst=*|max_report_luns=*)
extra_scsi_params="$extra_scsi_params $p"
;;
esac
done

echo "Loading kernel/drivers/scsi/scsi_mod.ko $extra_scsi_params"
insmod /lib/modules/2.6.4-52-default/kernel/drivers/scsi/scsi_mod.ko $extra_scsi_params

echo "Loading kernel/drivers/scsi/sd_mod.ko"
insmod /lib/modules/2.6.4-52-default/kernel/drivers/scsi/sd_mod.ko

echo "Loading kernel/fs/reiserfs/reiserfs.ko"
insmod /lib/modules/2.6.4-52-default/kernel/fs/reiserfs/reiserfs.ko

echo "Loading kernel/drivers/usb/core/usbcore.ko"
insmod /lib/modules/2.6.4-52-default/kernel/drivers/usb/core/usbcore.ko

echo "Loading kernel/drivers/usb/host/ehci-hcd.ko"
insmod /lib/modules/2.6.4-52-default/kernel/drivers/usb/host/ehci-hcd.ko

echo "Loading kernel/drivers/usb/storage/usb-storage.ko"
insmod /lib/modules/2.6.4-52-default/kernel/drivers/usb/storage/usb-storage.ko

echo .
echo .
echo Creating and mounting Ramdisk
echo .
mount -n -tramfs /dev/ram1 /ramdisk
mkdir -p /ramdisk/newroot
mkdir -p /ramdisk/initrd
echo .
echo .

udev_discover_root() {
local root
case "$rootdev" in
/dev/*) root=$(expr substr $rootdev 6 99) ;;
esac
if [ -n "$root" ]; then
echo -n "Waiting for device /dev/$root to appear: "
for i in 1 2 3 4 5; do
if [ -e /dev/$root ]; then

if [ $? -eq 0 ]; then
echo " ok"

echo .
echo .
echo Mounting SDA1
echo .
mount -n /dev/sda1 /source
echo .
echo Copying RescueImage to Ramdisk
echo .
cp /source/rescue.gz /ramdisk
echo .
echo Unpacking RescueImage
echo .
gzip -d /ramdisk/rescue.gz
echo .
echo Mounting RescueImage
echo .
mount -oloop /ramdisk/rescue /ramdisk
echo .
export rootdev=/dev/ram1
#pivot_root /ramdisk/newroot /ramdisk/initrd
root=$(expr substr $rootdev 6 99)
path=$(udevinfo -q path -n $root)
break
else
path=
fi
fi
sleep 1
echo -n "."
done
if [ -n "$path" ]; then
dev=/sys$path/dev
if [ -f $dev ]; then
local major minor devn
IFS=":" read major minor < $dev
devn=$(mkdevn $major $minor)
echo "rootfs: $entry major=$major minor=$minor" \
"devn=$devn"
echo $devn > /proc/sys/kernel/real-root-dev
return 0
fi
fi
return 1
fi
}

if udev_discover_root ; then
die 0
else
echo "not found -- device nodes:"
cd /dev
for dev in *; do
if [ -e $dev ]; then
echo -n "$dev "
fi
done
cd /
fi

basename() {
local IFS=/

set -- $1
eval echo \${$#}
}

sysfs_set_root_dir() {
local entry name dir=$1 search=$2

for entry in $dir/*; do
[ -L $entry ] && continue
[ -d $entry ] || continue

name=$(basename $entry)
if [ -f $entry/dev -a $name = $search ]; then
local major minor devn
IFS=: read major minor < $entry/dev
devn=$(mkdevn $major $minor)
echo "rootfs: $entry major=$major minor=$minor" \
"devn=$devn"
echo $devn > /proc/sys/kernel/real-root-dev
return 0
else
sysfs_set_root_dir $entry $search \
&& return 0
fi
done
return 1
}

sysfs_set_root() {
local root=$1

sysfs_set_root_dir /sys/block $root
}

discover_root() {
local root
case $rootdev in
/dev/*) root=$(expr substr $rootdev 6 99) ;;
*)
esac
if [ -n "$root" ]; then
while :; do
idx=$(expr index $root /)
[ $idx = 0 ] && break
root=$(expr substr $root 1 $(expr $idx - 1)
)!$(expr substr $root $(expr $idx + 1) 99)
done
sysfs_set_root $root
fi
}

if ! discover_root ; then
if [ -n "$rootdev" ]; then
echo $rootdev > /proc/sys/kernel/real-root-dev
elif [ -n "$rootdevn" ]; then
echo $rootdevn > /proc/sys/kernel/real-root-dev
else
: # let the kernel do its internal root device scan
# (we don't get here.)
fi
fi

die 0

System: SuSE Linux 9.1, 256MB-USB-Stick, 512MB Ram, Linux NUR Textmodus zur Datenrettung auf Servern

Gruß,
Christian
 
Zuletzt bearbeitet von einem Moderator:

Ähnliche Themen

Verschlüsseltes Backup-Script mit rsync

Crontab und Scripts - Problem

Port generieren, wenn nicht dann

Queue für copy Script

Problem mit HSPA+ Modem Huawei E353 - Installation unmöglich?

Zurück
Oben