Ok sorry about that, the thing is "redhat name scheme" didn't mean a thing to me so I figured the bug has not been reported already.
Here is the solution I've tested : First patch set : hook-functions and mkinitramfs are modified in order to detect the symlink between /dev/vg/lv -> /dev/mapper/vg-lv and include the required lvm script in the ramdisk. Second patch set : lvm and lvm2 scripts do a little bit more tests before giving up on lvm activation. If the device does not look like a /dev/mapper/* file it converts the root from /dev/vg/lv to /dev/mapper/vg-lv. If things looks ok, tests activation with vgchange -t (test mode). If things are ok, activates the volume group the usual way. I've tested this solution using a /dev/lvm/root entry in mtab and root=/dev/lvm/root in kernel command line and it's working. I think the changes should not break anything else. I'm sure you will give my small work a check. Thank you. Jerome On Monday 07 January 2008, you wrote: > On Mon, Jan 07, 2008 at 07:42:49PM +0100, Jerome Vizcaino wrote: > > The thing is, when detecting the root filesystem device, the script > > should check if the device is a link and if so, check if the target is of > > the form /dev/mapper/* > > > > Changing the root filesystem to /dev/mapper/lvm-root solved the problem > > (after I wasted about an hour). > > duplicate bug report explained in many other already, > check out for rh lvm naming scheme and propose a solution. > > closing as no usefull info.
--- /usr/share/initramfs-tools/hook-functions.orig 2008-01-07 23:40:30.000000000 +0100 +++ /usr/share/initramfs-tools/hook-functions 2008-01-07 23:46:50.000000000 +0100 @@ -223,7 +223,10 @@ # findout root block device + fstype eval "$(mount | awk '/ \/ / {print "root=" $1 "\nFSTYPE=" $5; exit}')" - + + # If root device is a link, get the real device instead + [ -h "$root" ] && [ -h "$root" ] && root=$(readlink "$root") + # find out real rootfs on auto type if [ "${FSTYPE}" = "auto" ]; then eval "$(/usr/lib/klibc/bin/fstype ${root})"
--- /usr/sbin/mkinitramfs.orig 2008-01-07 23:48:48.000000000 +0100 +++ /usr/sbin/mkinitramfs 2008-01-07 23:49:34.000000000 +0100 @@ -258,6 +258,9 @@ mv ${DESTDIR}/bin/sh.shared ${DESTDIR}/bin/sh # those root need busybox eval "$(mount | awk '/ \/ / {print "r_dev=" $1; exit}')" + # root device is a symlink, get the real device + [ -h "$r_dev" ] && r_dev=$(readlink "$r_dev") + if [ "${r_dev#/dev/mapper/}" != "${r_dev}" ] \ || [ "${r_dev#/dev/md}" != "${r_dev}" ]; then echo "Warning: Busybox is required for successful boot!"
--- /usr/share/initramfs-tools/scripts/local-top/lvm2.orig 2008-01-08 00:01:06.000000000 +0100 +++ /usr/share/initramfs-tools/scripts/local-top/lvm2 2008-01-08 22:00:06.000000000 +0100 @@ -37,10 +37,32 @@ ;; esac + # Make sure root device is not a symlink + [ -h "$vg" ] && vg=$(readlink "$vg") # Make sure that we have a d-m path vg=${vg#/dev/mapper/} if [ "$vg" = "$1" ]; then - return 1 + # Convert RedHat name /dev/vg/lv to /dev/mapper/vg-lv + vg=$(echo $vg | sed -e 's#\(.*\)/\([^/]*\)/\(.*\)$#\1/mapper/\2-\3#') + # Check if it looks valid + if [ "${vg#/dev/mapper/}" = "$vg" ]; then + return 1; + fi + # Remove /dev/mapper + vg=${vg#/dev/mapper/} + # Split volume group from logical volume. + local test_vg=$(echo ${vg} | sed -e 's#\(.*\)\([^-]\)-[^-].*#\1\2#') + # Reduce padded --'s to -'s + test_vg=$(echo ${test_vg} | sed -e 's#--#-#g') + # Test if it's a valid LVM volume group + # This does not activate it, if everything is ok + # activation will be done later. + vgchange -ay -t $test_vg + if [ $? -ne 0 ]; then + return 1 + fi + # Everything looks fine, vg is in the expected + # form for proper script completion fi # Make sure that the device includes at least one dash
--- /usr/share/initramfs-tools/scripts/local-top/lvm.orig 2008-01-08 00:01:04.000000000 +0100 +++ /usr/share/initramfs-tools/scripts/local-top/lvm 2008-01-08 22:00:44.000000000 +0100 @@ -37,10 +37,32 @@ ;; esac + # Make sure root device is not a symlink + [ -h "$vg" ] && vg=$(readlink "$vg") # Make sure that we have a d-m path vg=${vg#/dev/mapper/} if [ "$vg" = "$1" ]; then - return 1 + # Convert RedHat name /dev/vg/lv to /dev/mapper/vg-lv + vg=$(echo $vg | sed -e 's#\(.*\)/\([^/]*\)/\(.*\)$#\1/mapper/\2-\3#') + # Check if it looks valid + if [ "${vg#/dev/mapper/}" = "$vg" ]; then + return 1; + fi + # Remove /dev/mapper + vg=${vg#/dev/mapper/} + # Split volume group from logical volume. + local test_vg=$(echo ${vg} | sed -e 's#\(.*\)\([^-]\)-[^-].*#\1\2#') + # Reduce padded --'s to -'s + test_vg=$(echo ${test_vg} | sed -e 's#--#-#g') + # Test if it's a valid LVM volume group + # This does not activate it, if everything is ok + # activation will be done later. + vgchange -ay -t $test_vg + if [ $? -ne 0 ]; then + return 1 + fi + # Everything looks fine, vg is in the expected + # form for proper script completion fi # Make sure that the device includes at least one dash