public inbox for gentoo-user@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-user] hard disk name changes within initramfs
@ 2012-12-06 14:22 Helmut Jarausch
  2012-12-06 14:31 ` Todd Goodman
  2012-12-06 16:55 ` J. Roeleveld
  0 siblings, 2 replies; 6+ messages in thread
From: Helmut Jarausch @ 2012-12-06 14:22 UTC (permalink / raw
  To: gentoo-user

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 "$@"


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [gentoo-user] hard disk name changes within initramfs
  2012-12-06 14:22 [gentoo-user] hard disk name changes within initramfs Helmut Jarausch
@ 2012-12-06 14:31 ` Todd Goodman
  2012-12-06 15:54   ` Paul Hartman
  2012-12-06 16:55 ` J. Roeleveld
  1 sibling, 1 reply; 6+ messages in thread
From: Todd Goodman @ 2012-12-06 14:31 UTC (permalink / raw
  To: gentoo-user

* Helmut Jarausch <jarausch@igpm.rwth-aachen.de> [121206 09:27]:
> 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.
[..]

I can't tell you why it changed but after my device names got messed
around with (after an upgrade) and the next boot mounted /home on /tmp
and an initscript blew away a bunch of home directories before I caught
it I switched to mounting via UUID.  Once you find the UUID to use it's
easy and alleviates lots of problems in the future.

Todd


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [gentoo-user] hard disk name changes within initramfs
  2012-12-06 14:31 ` Todd Goodman
@ 2012-12-06 15:54   ` Paul Hartman
  0 siblings, 0 replies; 6+ messages in thread
From: Paul Hartman @ 2012-12-06 15:54 UTC (permalink / raw
  To: gentoo-user

On Thu, Dec 6, 2012 at 8:31 AM, Todd Goodman <tsg@bonedaddy.net> wrote:
> Once you find the UUID to use it's
> easy and alleviates lots of problems in the future.

I agree.  Depending on your setup and bootloader you may need to use
labels instead of UUID.

/sbin/blkid can tell you the names, labels and UUIDs for all of your
block devices/partitions.


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [gentoo-user] hard disk name changes within initramfs
  2012-12-06 14:22 [gentoo-user] hard disk name changes within initramfs Helmut Jarausch
  2012-12-06 14:31 ` Todd Goodman
@ 2012-12-06 16:55 ` J. Roeleveld
  2012-12-06 18:05   ` Helmut Jarausch
  1 sibling, 1 reply; 6+ messages in thread
From: J. Roeleveld @ 2012-12-06 16:55 UTC (permalink / raw
  To: gentoo-user

Helmut Jarausch <jarausch@igpm.rwth-aachen.de> 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.


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [gentoo-user] hard disk name changes within initramfs
  2012-12-06 16:55 ` J. Roeleveld
@ 2012-12-06 18:05   ` Helmut Jarausch
  0 siblings, 0 replies; 6+ messages in thread
From: Helmut Jarausch @ 2012-12-06 18:05 UTC (permalink / raw
  To: gentoo-user

Many thanks to Todd, Paul and J. Roeleveld.

I have replaced device names like /dev/sda1 by UUIDs in my fstab which  
I have copied
to /usr/src/initramfs/etc, as well.
Having rebuild the kernel (with an integrated initramfs) seems to work.

Thanks again,
Helmut.


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [gentoo-user] hard disk name changes within initramfs
       [not found] ` <kdKMh-3zn-1@gated-at.bofh.it>
@ 2012-12-10 13:29   ` Gregory Shearman
  0 siblings, 0 replies; 6+ messages in thread
From: Gregory Shearman @ 2012-12-10 13:29 UTC (permalink / raw
  To: gentoo-user

In linux.gentoo.user, you wrote:
> * Helmut Jarausch <jarausch@igpm.rwth-aachen.de> [121206 09:27]:
>> 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.
> [..]
>
> I can't tell you why it changed but after my device names got messed
> around with (after an upgrade) and the next boot mounted /home on /tmp
> and an initscript blew away a bunch of home directories before I caught
> it I switched to mounting via UUID.  Once you find the UUID to use it's
> easy and alleviates lots of problems in the future.
>
> Todd

All of the partitions of my HDD (including the root partition) are LVM
partitions so I don't have to worry about this problem at all.

-- 
Regards,
Gregory.


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2012-12-10 13:31 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-12-06 14:22 [gentoo-user] hard disk name changes within initramfs Helmut Jarausch
2012-12-06 14:31 ` Todd Goodman
2012-12-06 15:54   ` Paul Hartman
2012-12-06 16:55 ` J. Roeleveld
2012-12-06 18:05   ` Helmut Jarausch
     [not found] <kdKCB-3q5-1@gated-at.bofh.it>
     [not found] ` <kdKMh-3zn-1@gated-at.bofh.it>
2012-12-10 13:29   ` Gregory Shearman

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox