Bug#513504: flash-kernel should handle LVM roots better
* Paul Jakma <paul+debianbugs@jakma.org> [2009-01-29 17:45]:
> A workaround, according to tbm, would be to have flash-kernel
> canonicalise LVM devices to their /dev/mapper/... form - I gather.
It's not a workaround; it's the proper solution.
maks, can you comment on this patch. I've attached the full hook for
context. Maybe you'll find other cases that need to be handled in a
special way.
Index: initramfs-tools/hooks/flash_kernel_set_root
===================================================================
--- initramfs-tools/hooks/flash_kernel_set_root (revision 56152)
+++ initramfs-tools/hooks/flash_kernel_set_root (working copy)
@@ -43,6 +43,13 @@
# Record the root filesystem device for use during boot
rootdev=$(egrep '^[^# ]+[ ]+/[ ]' /etc/fstab | awk '{print $1}') || true
+# Map LVM devices in the form of /dev/vg/lv to /dev/mapper/, otherwise
+# initramfs won't initialize them.
+link=$(readlink -f $rootdev)
+if echo "$link" | grep -q "^/dev/mapper/"; then
+ rootdev=$link
+fi
+
# Translate LABEL and UUID entries into a proper device name.
if echo "$rootdev" | grep -q "="; then
a=$(echo "$rootdev" | cut -d "=" -f 1)
--
Martin Michlmayr
http://www.cyrius.com/
#!/bin/sh
# This code is covered by the GNU General Public License (GPLv2 or higher)
PREREQ=""
prereqs() {
echo "$PREREQ"
}
pause_error() {
#exit 1 # won't work; initramfs-tools ignores hook script exit code
echo "" >&2
if [ "$DEBIAN_FRONTEND" = "noninteractive" ] ; then
echo "Unable to abort; system will probably be broken!" >&2
else
echo "Press Ctrl-C to abort build, or Enter to continue" >&2
read
fi
}
case $1 in
prereqs)
prereqs
exit 0
;;
esac
. /usr/share/initramfs-tools/hook-functions
# Only run on some machines
machine=$(grep "^Hardware" /proc/cpuinfo | sed 's/Hardware\s*:\s*//')
case "$machine" in
"Buffalo Linkstation Pro/Live" | "Buffalo/Revogear Kurobox Pro" | "D-Link DNS-323" | "GLAN Tank" | "HP Media Vault mv2120" | "Linksys NSLU2" | "QNAP TS-109/TS-209" | "QNAP TS-409" | "Thecus N2100")
# Pass the check and continue below
;;
*)
# If the machine is not listed, don't run this hook
exit 0
;;
esac
# Record the root filesystem device for use during boot
rootdev=$(egrep '^[^# ]+[ ]+/[ ]' /etc/fstab | awk '{print $1}') || true
# Map LVM devices in the form of /dev/vg/lv to /dev/mapper/, otherwise
# initramfs won't initialize them.
link=$(readlink -f $rootdev)
if echo "$link" | grep -q "^/dev/mapper/"; then
rootdev=$link
fi
# Translate LABEL and UUID entries into a proper device name.
if echo "$rootdev" | grep -q "="; then
a=$(echo "$rootdev" | cut -d "=" -f 1)
b=$(echo "$rootdev" | cut -d "=" -f 2- | sed -e 's/^"\(.*\)"$/\1/')
case "$a" in
LABEL)
c=$(echo "$b" | sed 's#/#\\x2f#g')
if [ -e /dev/disk/by-label/$c ]; then
rootdev="/dev/disk/by-label/$c"
else
echo "Label $b not found in /dev/disk/by-label" >&2
fi
;;
UUID)
rootdev=/dev/disk/by-uuid/$b
if [ ! -e $rootdev ]; then
echo "UUID $b doesn't exist in /dev/disk/by-uuid" >&2
fi
;;
*)
echo "/etc/fstab parse error; cannot recognize root $rootdev" >&2
;;
esac
fi
if [ ! -e "$rootdev" ]; then
rootdev=/dev/sda2
echo "Warning: /etc/fstab parse error; guessing that the root device is $rootdev" >&2
pause_error
fi
case "$machine" in
# The boot loader doesn't pass root= on the command line, so
# provide a default.
"Linksys NSLU2")
install -d $DESTDIR/conf/conf.d
echo "ROOT=\"$rootdev\"" > $DESTDIR/conf/conf.d/default_root
;;
# The boot loader passes a bogus root= (e.g. root=/dev/ram), so
# override the command line parameter.
"Buffalo Linkstation Pro/Live" | "Buffalo/Revogear Kurobox Pro" | "D-Link DNS-323" | "GLAN Tank" | "HP Media Vault mv2120" | "QNAP TS-109/TS-209" | "QNAP TS-409" | "Thecus N2100")
install -d $DESTDIR/conf
echo "ROOT=\"$rootdev\"" >> $DESTDIR/conf/param.conf
;;
# This shouldn't happen - only if a device from the case statement
# above wasn't added here.
*)
echo "Device $machine not supported. Please file a bug." >&2
pause_error
;;
esac
Reply to: