Hello,
I spoke to Colin Watson on IRC recently and asked if the use of labels
could be made an option in grub2 in the future.
He suggested I mention it on this list.
In the meantime I have made some patches to demonstrate this idea in
grub 1.98 which I have attached.
They work fine for me, with GRUB_USE_LABEL="true" set in
/etc/default/grub in my Mandriva-Linux systems.
A grub.cfg produced with a patched grub2 is attached also.
I am not a professional programmer, so I would appreciate any
constructive criticism, and your comments in general on this idea.
Thanks,
Barry Jackson
--- /etc/grub.d/10_linux 2010-11-02 22:25:19.849508548 +0000
+++ 10_linux 2010-11-02 22:05:31.000000000 +0000
@@ -42,11 +42,17 @@
;;
esac
+# If device has no uuid OR GRUB_DISABLE_LINUX_UUID is true OR search for dev
with uuid fails (bcj)
if [ "x${GRUB_DEVICE_UUID}" = "x" ] || [ "x${GRUB_DISABLE_LINUX_UUID}" =
"xtrue" ] \
|| ! test -e "/dev/disk/by-uuid/${GRUB_DEVICE_UUID}" ; then
LINUX_ROOT_DEVICE=${GRUB_DEVICE}
else
- LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID}
+# If A label exists and GRUB_USE_LABEL=true is in /etc/default/grub (bcj)
+ if [ "x${GRUB_DEVICE_LABEL}" != "x" ] && [ "x${GRUB_USE_LABEL}" = "xtrue"
]; then
+ LINUX_ROOT_DEVICE=LABEL=${GRUB_DEVICE_LABEL}
+ else
+ LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID}
+ fi
fi
linux_entry ()
@@ -111,7 +117,6 @@
version=`echo $basename | sed -e "s,^[^0-9]*-,,g"`
alt_version=`echo $version | sed -e "s,\.old$,,g"`
linux_root_device_thisversion="${LINUX_ROOT_DEVICE}"
-
initrd=
for i in "initrd.img-${version}" "initrd-${version}.img" \
"initrd-${version}" "initrd.img-${alt_version}" \
--- /usr/sbin/grub2-mkconfig 2010-11-02 22:38:20.610505816 +0000
+++ grub2-mkconfig 2010-11-02 22:35:32.000000000 +0000
@@ -122,6 +122,11 @@
GRUB_DEVICE="`${grub_probe} --target=device /`"
GRUB_DEVICE_UUID="`${grub_probe} --device ${GRUB_DEVICE} --target=fs_uuid 2>
/dev/null`" || true
+# In grub 1.98 "grub-probe --target=fs_label" is not supported so using blkid
(bcj)
+if blkid ${GRUB_DEVICE}| grep -q "LABEL=";then
+GRUB_DEVICE_LABEL=$(blkid ${GRUB_DEVICE}| grep "LABEL=" |tr -s 'LABEL=' '*' |
cut -d* -f2 | cut -d'"' -f2)
+fi
+
# Device containing our /boot partition. Usually the same as GRUB_DEVICE.
GRUB_DEVICE_BOOT="`${grub_probe} --target=device /boot`"
GRUB_DEVICE_BOOT_UUID="`${grub_probe} --device ${GRUB_DEVICE_BOOT}
--target=fs_uuid 2> /dev/null`" || true
@@ -199,6 +204,8 @@
# override them.
export GRUB_DEVICE \
GRUB_DEVICE_UUID \
+ GRUB_DEVICE_LABEL \
+ GRUB_USE_LABEL \
GRUB_DEVICE_BOOT \
GRUB_DEVICE_BOOT_UUID \
GRUB_FS \
@@ -226,6 +233,8 @@
GRUB_INIT_TUNE \
GRUB_SAVEDEFAULT
+
+
if test "x${grub_cfg}" != "x"; then
rm -f ${grub_cfg}.new
exec > ${grub_cfg}.new
--- /usr/lib/grub/grub-mkconfig_lib 2010-10-23 15:16:16.000000000 +0100
+++ grub-mkconfig_lib 2010-11-02 22:31:03.000000000 +0000
@@ -120,10 +120,15 @@
# If there's a filesystem UUID that GRUB is capable of identifying, use it;
# otherwise set root as per value in device.map.
+# If a label is available and GRUB_USE_LABEL=true then use label (bcj)
+if [ "x${GRUB_DEVICE_LABEL}" != "x" ] && [ "x${GRUB_USE_LABEL}" = "xtrue" ];
then
+ echo "search --no-floppy --label --set ${GRUB_DEVICE_LABEL}"
+else
echo "set root='`${grub_probe} --device ${device} --target=drive`'"
if fs_uuid="`${grub_probe} --device ${device} --target=fs_uuid 2>
/dev/null`" ; then
echo "search --no-floppy --fs-uuid --set ${fs_uuid}"
fi
+fi
}
grub_file_is_not_garbage ()
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by /usr/sbin/grub2-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#
### BEGIN /etc/grub.d/00_header ###
if [ -s $prefix/grubenv ]; then
load_env
fi
set default="0"
if [ ${prev_saved_entry} ]; then
set saved_entry=${prev_saved_entry}
save_env saved_entry
set prev_saved_entry=
save_env prev_saved_entry
set boot_once=true
fi
function savedefault {
if [ -z ${boot_once} ]; then
saved_entry=${chosen}
save_env saved_entry
fi
}
insmod ext2
search --no-floppy --label --set 2010_1_64_root
if loadfont /usr/share/grub/unicode.pf2 ; then
set gfxmode=auto
insmod gfxterm
insmod vbe
if terminal_output gfxterm ; then true ; else
# For backward compatibility with versions of terminal.mod that don't
# understand terminal_output
terminal gfxterm
fi
fi
insmod ext2
search --no-floppy --label --set 2010_1_64_root
set locale_dir=($root)/boot/grub2/locale
set lang=en
insmod gettext
set timeout=5
### END /etc/grub.d/00_header ###
### BEGIN /etc/grub.d/10_linux ###
menuentry "Mandriva GNU/Linux, with Linux 2.6.33.7-desktop-69mib" --class
mandriva --class gnu-linux --class gnu --class os {
set gfxpayload=keep
insmod ext2
search --no-floppy --label --set 2010_1_64_root
echo Loading Linux 2.6.33.7-desktop-69mib ...
linux /boot/vmlinuz-2.6.33.7-desktop-69mib root=LABEL=2010_1_64_root
ro splash=verbose
echo Loading initial ramdisk ...
initrd /boot/initrd-2.6.33.7-desktop-69mib.img
}
menuentry "Mandriva GNU/Linux, with Linux 2.6.33.7-desktop-2mnb" --class
mandriva --class gnu-linux --class gnu --class os {
set gfxpayload=keep
insmod ext2
search --no-floppy --label --set 2010_1_64_root
echo Loading Linux 2.6.33.7-desktop-2mnb ...
linux /boot/vmlinuz-2.6.33.7-desktop-2mnb root=LABEL=2010_1_64_root
ro splash=verbose
echo Loading initial ramdisk ...
initrd /boot/initrd-2.6.33.7-desktop-2mnb.img
}
menuentry "Mandriva GNU/Linux, with Linux 2.6.33.7-desktop-1mnb" --class
mandriva --class gnu-linux --class gnu --class os {
set gfxpayload=keep
insmod ext2
search --no-floppy --label --set 2010_1_64_root
echo Loading Linux 2.6.33.7-desktop-1mnb ...
linux /boot/vmlinuz-2.6.33.7-desktop-1mnb root=LABEL=2010_1_64_root
ro splash=verbose
echo Loading initial ramdisk ...
initrd /boot/initrd-2.6.33.7-desktop-1mnb.img
}
menuentry "Mandriva GNU/Linux, with Linux desktop" --class mandriva --class
gnu-linux --class gnu --class os {
insmod ext2
search --no-floppy --label --set 2010_1_64_root
echo Loading Linux desktop ...
linux /boot/vmlinuz-desktop root=LABEL=2010_1_64_root ro
splash=verbose
echo Loading initial ramdisk ...
initrd /boot/initrd-desktop.img
}
### END /etc/grub.d/10_linux ###
### BEGIN /etc/grub.d/30_os-prober ###
### END /etc/grub.d/30_os-prober ###
### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.
### END /etc/grub.d/40_custom ###
### BEGIN /etc/grub.d/90_persistent ###
### END /etc/grub.d/90_persistent ###
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/grub-devel