home > linux > scripts > os-prober-alphabetic-grub-listings-and-tweeks

os-prober alphabetic grub listings and tweeks

19 | 22 Nov 2011

cd 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;

grub-update

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

Post a Comment