Helmut Jarausch <[email protected]> wrote:

>Hi,
>
>on one of several machines I have a problem with initramfs.
>
>The machine has a single SATA drive. When the kernel boots it shows  
>that it is called /dev/sda,....
>Now, within the init script of my initramfs it tries to mount /dev/sda2
> 
>as root but fails.
>Since the initramfs spawns a shell (busybox) I can see the device files
> 
>for /dev/sda?
>but fdisk /dev/sda fails.
>As it turns out, the harddisk is now named /dev/sdb with /dev/sdb?  
>partition names.
>
>Since this setup is identical to that of several other machines where  
>it just works,
>I'm puzzled.
>
>Has anybody an idea what might be going on?
>
>Many thanks,
>Helmut.
>
>This is my init script
>
>#!/bin/busybox sh
>
>rescue_shell() {
>     echo "$@"
>     echo "Something went wrong. Dropping you to a shell."
>     busybox --install -s
>     exec /bin/sh
>}​
>
>uuidlabel_root() {
>     for cmd in $(cat /proc/cmdline) ; do
>         case $cmd in
>         root=*)
>             type=$(echo $cmd | cut -d= -f2)
>             echo "Mounting rootfs"
>             if [ $type == "LABEL" ] || [ $type == "UUID" ] ; then
>                 uuid=$(echo $cmd | cut -d= -f3)
>                 mount -o ro $(findfs "$type"="$uuid") /mnt/root
>             else
>                 mount -o ro $(echo $cmd | cut -d= -f2) /mnt/root
>             fi
>             ;;
>         esac
>     done
>}​
>
>check_filesystem() {
>     # most of code coming from /etc/init.d/fsck
>
>     local fsck_opts= check_extra= RC_UNAME=$(uname -s)
>
>     # FIXME : get_bootparam forcefsck
>     if [ -e /forcefsck ]; then
>         fsck_opts="$fsck_opts -f"
>         check_extra="(check forced)"
>     fi
>
>     echo "Checking local filesystem $check_extra : $1"
>
>     if [ "$RC_UNAME" = Linux ]; then
>         fsck_opts="$fsck_opts -C0 -T"
>     fi
>
>     trap : INT QUIT
>
>     # using our own fsck, not the builtin one from busybox
>     /sbin/fsck ${fsck_args--p} $fsck_opts $1
>
>     case $? in
>         0)      return 0;;
>         1)      echo "Filesystem repaired"; return 0;;
>         2|3)    if [ "$RC_UNAME" = Linux ]; then
>                         echo "Filesystem repaired, but reboot needed"
>                         reboot -f
>                 else
>                         rescue_shell "Filesystem still have errors;  
>manual fsck required"
>                 fi;;
>         4)      if [ "$RC_UNAME" = Linux ]; then
>                         rescue_shell "Fileystem errors left  
>uncorrected, aborting"
>                 else
>                         echo "Filesystem repaired, but reboot needed"
>                         reboot
>                 fi;;
>         8)      echo "Operational error"; return 0;;
>         12)     echo "fsck interrupted";;
>         *)      echo "Filesystem couldn't be fixed";;
>     esac
>     rescue_shell
>}​
>
># temporarily mount proc and sys
>mount -t proc none /proc
>mount -t sysfs none /sys
>
>echo /sbin/mdev > /proc/sys/kernel/hotplug
>mdev -s
>
># only do this if you've built devtmpfs support into your kernel
># mount -t devtmpfs none /dev  HJ: done by the kernel itself
>
># disable kernel messages from popping onto the screen
>echo 0 > /proc/sys/kernel/printk
>
># clear the screen
># clear
>
>
># ====================== start doing stuff
>
># mounting rootfs on /mnt/root
>uuidlabel_root || rescue_shell "Error with uuidlabel_root"
>
>btrfs device scan
>
># space separated list of mountpoints that ...
>mountpoints="/usr"
>
># ... we want to find in /etc/fstab ...
># ln -s /mnt/root/etc/fstab /etc/fstab
>
># ... to check filesystems and mount our devices.
>for m in $mountpoints ; do
>     check_filesystem $m
>
>     echo "Mounting $m"
>     # mount the device and ...
>     mount $m || rescue_shell "Error while mounting $m"
>
>     # ... move the tree to its final location
>    mount --move $m "/mnt/root"$m || rescue_shell "Error while moving  
>$m"
>done
>
>echo "All done. Switching to real root."
>
># ====================== end doing stuff
>
>mount -o remount,rw /mnt/root
>cp /proc/mounts /mnt/root/mtab
>
># clean up. The init process will remount proc sys and dev later
>umount /proc
>umount /sys
># umount /dev   # fails, since it's automounted by the kernel
>
># switch to the real root and execute init
>exec switch_root /mnt/root /sbin/init "$@"

Did you have anything connected via USB? Or maybe a CD/DVD? 
Am thinking something got detected first.
Solution could be to put non-boot devices (like usb-storage) as modules.

--
Joost
-- 
Sent from my Android phone with K-9 Mail. Please excuse my brevity.

Reply via email to