os-prober alphabetic grub listings and tweeks
19 | 22 Nov 2011cd to /etc/grub.d/
in this directory you will find grub scripts that generate the grub.cfg file;
to strip out any windows recovery entries you can add;
if [ "${LONGNAME}" = "Windows Recovery Environment (loader)" ]; then
continue
fi
to strip out any recovery linux entries add this to the linux specific catch;
if [ -n "`echo ${LLABEL} | grep '.*recovery.*'`" ]; then
continue
fi
I also had a fedora entry that duplicated, same boot options par one had no initrd image file, to strip that out i added;
if [ -z "${LINITRD}" ]; then
continue
fi
With a number of distro's installed i decided i wanted my listings to be alphabetical, to sort this i edited the main loop from;
for OS in ${OSPROBED}; do
to
for OS in $(echo ${OSPROBED} | tr " " "n" | tr ":" " " | sort -k 2,3 | uniq | tr " " ":") ; do
finally I wanted to tweek some of the entries names, to do this i created a name.list file with replacements, and had the script update any without aliases into an nonames.list file. This means when i want to rename on I can simply copy it's entry into the names.list file and replace the name.
CHECK_NAME=`cat /etc/grub.d/names.list | grep "${OS}" | cut -d "," -f "2"`
if [ -n "${CHECK_NAME}" ]; then
LONGNAME="${CHECK_NAME}"
else
echo "${OS}" >> /etc/grub.d/nonames.list
LONGNAME="`echo ${OS} | cut -d ':' -f 2 | tr '^' ' '`"
fi
The only other tweek i had to use to maintain this was the linux entries don't always use the LONGNAME field as their text label. This was changes but only after the check for recovery labels.
LLABEL="${LONGNAME}"
done! :)
a grub update should look nice n prittey now;
full source:
#! /bin/sh
set -e
# grub-mkconfig helper script.
# Copyright (C) 2006,2007,2008,2009 Free Software Foundation, Inc.
#
# GRUB is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# GRUB is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GRUB. If not, see .
#
# tweeked by mikejonesey - www.mikejonesey.co.uk
#
prefix=/usr
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
. ${libdir}/grub/grub-mkconfig_lib
if [ "x${GRUB_DISABLE_OS_PROBER}" = "xtrue" ]; then
exit 0
fi
if [ -z "`which os-prober 2> /dev/null`" -o -z "`which linux-boot-prober 2> /dev/null`" ] ; then
# missing os-prober and/or linux-boot-prober
exit 0
fi
OSPROBED="`os-prober | tr ' ' '^' | paste -s -d ' '`"
if [ -z "${OSPROBED}" ] ; then
# empty os-prober output, nothing doing
exit 0
fi
osx_entry() {
cat << EOF
menuentry "${LONGNAME} (${2}-bit) (on ${DEVICE})" {
EOF
save_default_entry | sed -e "s/^/t/"
prepare_grub_to_access_device ${DEVICE} | sed -e "s/^/t/"
cat << EOF
load_video
set do_resume=0
if [ /var/vm/sleepimage -nt10 / ]; then
if xnu_resume /var/vm/sleepimage; then
set do_resume=1
fi
fi
if [ $do_resume = 0 ]; then
xnu_uuid ${OSXUUID} uuid
if [ -f /Extra/DSDT.aml ]; then
acpi -e /Extra/DSDT.aml
fi
$1 /mach_kernel boot-uuid=${uuid} rd=*uuid
if [ /System/Library/Extensions.mkext -nt /System/Library/Extensions ]; then
xnu_mkext /System/Library/Extensions.mkext
else
xnu_kextdir /System/Library/Extensions
fi
if [ -f /Extra/Extensions.mkext ]; then
xnu_mkext /Extra/Extensions.mkext
fi
if [ -d /Extra/Extensions ]; then
xnu_kextdir /Extra/Extensions
fi
if [ -f /Extra/devprop.bin ]; then
xnu_devprop_load /Extra/devprop.bin
fi
if [ -f /Extra/splash.jpg ]; then
insmod jpeg
xnu_splash /Extra/splash.jpg
fi
if [ -f /Extra/splash.png ]; then
insmod png
xnu_splash /Extra/splash.png
fi
if [ -f /Extra/splash.tga ]; then
insmod tga
xnu_splash /Extra/splash.tga
fi
fi
}
EOF
}
echo -n "" > /etc/grub.d/nonames.list
for OS in $(echo ${OSPROBED} | tr " " "n" | tr ":" " " | sort -k 2,3 | uniq | tr " " ":") ; do
DEVICE="`echo ${OS} | cut -d ':' -f 1`"
#echo "${OS}" >&2
CHECK_NAME=`cat /etc/grub.d/names.list | grep "${OS}" | cut -d "," -f "2"`
if [ -n "${CHECK_NAME}" ]; then
LONGNAME="${CHECK_NAME}"
else
echo "${OS}" >> /etc/grub.d/nonames.list
LONGNAME="`echo ${OS} | cut -d ':' -f 2 | tr '^' ' '`"
fi
LABEL="`echo ${OS} | cut -d ':' -f 3 | tr '^' ' '`"
BOOT="`echo ${OS} | cut -d ':' -f 4`"
if [ -z "${LONGNAME}" ] ; then
LONGNAME="${LABEL}"
fi
if [ "${LONGNAME}" = "Windows Recovery Environment (loader)" ]; then
continue
fi
echo "Found ${LONGNAME} on ${DEVICE}" >&2
case ${BOOT} in
chain)
cat << EOF
menuentry "${LONGNAME} (on ${DEVICE})" {
EOF
save_default_entry | sed -e "s/^/t/"
prepare_grub_to_access_device ${DEVICE} | sed -e "s/^/t/"
case ${LONGNAME} in
Windows Vista*|Windows 7*)
;;
*)
cat << EOF
drivemap -s (hd0) ${root}
EOF
;;
esac
cat < chainloader +1
}
EOF
;;
linux)
LINUXPROBED="`linux-boot-prober ${DEVICE} 2> /dev/null | tr ' ' '^' | paste -s -d ' '`"
prepare_boot_cache=
for LINUX in ${LINUXPROBED} ; do
LROOT="`echo ${LINUX} | cut -d ':' -f 1`"
LBOOT="`echo ${LINUX} | cut -d ':' -f 2`"
LLABEL="`echo ${LINUX} | cut -d ':' -f 3 | tr '^' ' '`"
LKERNEL="`echo ${LINUX} | cut -d ':' -f 4`"
LINITRD="`echo ${LINUX} | cut -d ':' -f 5`"
LPARAMS="`echo ${LINUX} | cut -d ':' -f 6- | tr '^' ' '`"
if [ -z "${LLABEL}" ] ; then
LLABEL="${LONGNAME}"
fi
if [ "${LROOT}" != "${LBOOT}" ]; then
LKERNEL="${LKERNEL#/boot}"
LINITRD="${LINITRD#/boot}"
fi
#mike says: no entries without initrd
if [ -z "${LINITRD}" ]; then
continue
fi
#mike says: no recovery entries
if [ -n "`echo ${LLABEL} | grep '.*recovery.*'`" ]; then
continue
fi
LLABEL="${LONGNAME}"
cat << EOF
menuentry "${LLABEL} (on ${DEVICE})" {
EOF
save_default_entry | sed -e "s/^/t/"
if [ -z "${prepare_boot_cache}" ]; then
prepare_boot_cache="$(prepare_grub_to_access_device ${LBOOT} | sed -e "s/^/t/")"
fi
printf '%sn' "${prepare_boot_cache}"
cat << EOF
linux ${LKERNEL} ${LPARAMS}
EOF
if [ -n "${LINITRD}" ] ; then
cat << EOF
initrd ${LINITRD}
EOF
fi
cat << EOF
}
EOF
done
;;
macosx)
OSXUUID="`grub-probe --target=fs_uuid --device ${DEVICE} 2> /dev/null`"
osx_entry xnu_kernel 32
osx_entry xnu_kernel64 64
;;
hurd)
cat << EOF
menuentry "${LONGNAME} (on ${DEVICE})" {
EOF
save_default_entry | sed -e "s/^/t/"
prepare_grub_to_access_device ${DEVICE} | sed -e "s/^/t/"
grub_device="`${grub_probe} --device ${DEVICE} --target=drive`"
mach_device="`echo "${grub_device}" | tr -d '()' | tr , s`"
grub_fs="`${grub_probe} --device ${DEVICE} --target=fs`"
case "${grub_fs}" in
*fs) hurd_fs="${grub_fs}" ;;
*) hurd_fs="${grub_fs}fs" ;;
esac
cat << EOF
multiboot /boot/gnumach.gz root=device:${mach_device}
module /hurd/${hurd_fs}.static ${hurd_fs} --readonly
--multiboot-command-line='${kernel-command-line}'
--host-priv-port='${host-port}'
--device-master-port='${device-port}'
--exec-server-task='${exec-task}' -T typed '${root}'
'$(task-create)' '$(task-resume)'
module /lib/ld.so.1 exec /hurd/exec '$(exec-task=task-create)'
}
EOF
;;
*)
echo " ${LONGNAME} is not yet supported by grub-mkconfig." >&2
;;
esac
done