grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: update-grub & Xen boot stanza generation


From: Vladimir 'φ-coder/phcoder' Serbinenko
Subject: Re: update-grub & Xen boot stanza generation
Date: Fri, 21 May 2010 02:35:48 +0200
User-agent: Mozilla-Thunderbird 2.0.0.22 (X11/20091109)

Bruce Edge wrote:
> 2010/5/20 Vladimir 'φ-coder/phcoder' Serbinenko <address@hidden
> <mailto:address@hidden>>
>
>     Bruce Edge wrote:
>     > Hi
>     > Apologies in advance if this is already in the works.
>     >
>     > I wanted to provide an etc/grub.d rule for generating boot
>     stanzas for
>     > Xen based systems such that it would end up in the upstream grub
>     release.
>     > If this conforms to the appropriate conventions, could someone
>     > possibly add it ?
>     >
>     > It's basically a copy of etc/grub.d/10_linux and adds checks for
>     dom0
>     > capable kernels. I picked "09_" as I assumed that one would want to
>     > default to the Xen boot entry, but that may be a matter of some
>     debate.
>     >
>     This is aready worked on but the problem is that it generates too much
>     entries. If you have 5 different versions of hypervisor and 10
>     different
>     kernels you have 100 entries.
>
>
> What if I add a max_entries option. Say, don't generate more than 4
> stanzas total. Although I suppose then I need to go through and pick
> the most recent kernel and hypervisor versions.
>
It feels like a kludgy solution
> Actually the hypervisor version isn't an issue,
> Xen installs a symlink for the most recent hypervisor in /boot,
No such link here and most recent may break after upgrade
> so one only needs to generate entries for one hypervisor.
>
> Where can I get a copy of the current implementation of this mechanism?
>
> Thanks
>
> -Bruce
>
>  
>
>     > Thanks
>     >
>     > -Bruce
>     >
>     >
>     > #!/bin/bash -e
>     >
>     
> #===============================================================================
>     > #
>     > #          FILE:  09_xen
>     > #
>     > #         USAGE:  update-grub ... with this in /etc/grub.d
>     > #
>     > #   DESCRIPTION: Generate grub2 boot stanza for Xen systems
>     > #                               Xen boot entries are automatically
>     > added to grub.cfg
>     > #                               The 09-... name prefix puts the Xen
>     > boot entries before
>     > #                               the linux kernel entries
>     > #
>     > #       OPTIONS:  ---
>     > #  REQUIREMENTS:  --- grub2, Xen hypervisor
>     > #          BUGS:  --- probably
>     > #         NOTES:  --- Copied from 10_linux with a few hacks to
>     make ir
>     > work for Xen.
>     > #                                       Incorporated suggestions to
>     > only do this for valid dom0 kernels
>     > #        AUTHOR:  Bruce Edge (BRE), address@hidden
>     <mailto:address@hidden>
>     > <mailto:address@hidden <mailto:address@hidden>>
>     > #       COMPANY:  LSI
>     > #       VERSION:  1.0
>     > #       CREATED:  05/19/2010 02:32:34 PM PDT
>     > #      REVISION:  ---
>     >
>     
> #===============================================================================
>     >
>     > prefix=/usr
>     > exec_prefix=${prefix}
>     > libdir=${exec_prefix}/lib
>     > . ${libdir}/grub/update-grub_lib
>     >
>     > if [ "x${GRUB_DISTRIBUTOR}" = "x" ] ; then
>     >   OS=GNU/Linux
>     > else
>     >   OS="${GRUB_DISTRIBUTOR}"
>     > fi
>     >
>     > # Source grub defaults
>     > . /etc/default/grub
>     >
>     > # loop-AES arranges things so that /dev/loop/X can be our root
>     device, but
>     > # the initrds that Linux uses don't like that.
>     > case ${GRUB_DEVICE} in
>     >   /dev/loop/*|/dev/loop[0-9])
>     >     GRUB_DEVICE=`losetup ${GRUB_DEVICE} | sed -e
>     > "s/^[^(]*(\([^)]\+\)).*/\1/"`
>     >   ;;
>     > esac
>     >
>     > 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}
>     > fi
>     >
>     > test_gt ()
>     > {
>     >   local a=`echo $1 | sed -e
>     > "s,.*/vmlinu[zx]-,,g;s/[._-]\(pre\|rc\|test\|git\|old\)/~\1/g"`
>     >   local b=`echo $2 | sed -e
>     > "s,.*/vmlinu[zx]-,,g;s/[._-]\(pre\|rc\|test\|git\|old\)/~\1/g"`
>     >   if [ "x$b" = "x" ] ; then
>     >     return 0
>     >   fi
>     >   dpkg --compare-versions "$a" gt "$b"
>     >   return $?
>     > }
>     >
>     > find_latest ()
>     > {
>     >   local a=""
>     >   for i in $@ ; do
>     >     if test_gt "$i" "$a" ; then
>     >       a="$i"
>     >     fi
>     >   done
>     >   echo "$a"
>     > }
>     >
>     > list=`for i in /boot/vmlinu[xz]-* /vmlinu[xz]-* ; do
>     >         if grub_file_is_not_garbage "$i" && grep -q 'DOM0=y'
>     > ${i/vmlinu[xz]/config} ; then echo -n "$i " ; fi
>     >       done`
>     >
>     > while [ "x$list" != "x" ] ; do
>     >   linux=`find_latest $list`
>     >   echo "Found linux image: $linux" >&2
>     >   basename=`basename $linux`
>     >   dirname=`dirname $linux`
>     >   rel_dirname=`make_system_path_relative_to_its_root $dirname`
>     >   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.img-${alt_version}"
>     "initrd-${alt_version}.img"; do
>     >     if test -e "${dirname}/${i}" ; then
>     >       initrd="$i"
>     >       break
>     >     fi
>     >   done
>     >   if test -n "${initrd}" ; then
>     >     echo "Found initrd image: ${dirname}/${initrd}" >&2
>     >   else
>     >     # "UUID=" magic is parsed by initrds.  Since there's no
>     initrd, it
>     > can't work here.
>     >     linux_root_device_thisversion=${GRUB_DEVICE}
>     >   fi
>     >
>     >   cat << EOF
>     >   insmod lvm
>     >   set root=(system-dom0_0)
>     > menuentry "Xen ${OS}, linux ${version}" {
>     >         multiboot dummy=dummy /boot/xen.gz $GRUB_CMDLINE_XEN_DEFAULT
>     >         module ${rel_dirname}/${basename}
>     > root=${linux_root_device_thisversion} $GRUB_CMDLINE_LINUX_DEFAULT
>     > EOF
>     >   if test -n "${initrd}" ; then
>     >     cat << EOF
>     >         module ${rel_dirname}/${initrd} ${rel_dirname}/${initrd}
>     > EOF
>     >   fi
>     >   cat << EOF
>     > }
>     > EOF
>     >
>     >   list=`echo $list | tr ' ' '\n' | grep -vx $linux | tr '\n' ' '`
>     > done
>     >
>     >
>     ------------------------------------------------------------------------
>     >
>     > _______________________________________________
>     > Grub-devel mailing list
>     > address@hidden <mailto:address@hidden>
>     > http://lists.gnu.org/mailman/listinfo/grub-devel
>     >
>
>
>     --
>     Regards
>     Vladimir 'φ-coder/phcoder' Serbinenko
>
>
>
>     _______________________________________________
>     Grub-devel mailing list
>     address@hidden <mailto:address@hidden>
>     http://lists.gnu.org/mailman/listinfo/grub-devel
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Grub-devel mailing list
> address@hidden
> http://lists.gnu.org/mailman/listinfo/grub-devel
>   


-- 
Regards
Vladimir 'φ-coder/phcoder' Serbinenko

#! /bin/sh -e

# grub-mkconfig helper script.
# Copyright (C) 2006,2007,2008,2009,2010  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 <http://www.gnu.org/licenses/>.

address@hidden@
address@hidden@
address@hidden@
address@hidden@
. ${libdir}/grub/grub-mkconfig_lib

export address@hidden@
export address@hidden@

CLASS="--class gnu-linux --class gnu --class os --class xen"

if [ "x${GRUB_DISTRIBUTOR}" = "x" ] ; then
  OS=GNU/Linux
else
  OS="${GRUB_DISTRIBUTOR} GNU/Linux"
  CLASS="--class $(echo ${GRUB_DISTRIBUTOR} | tr '[A-Z]' '[a-z]' | cut -d' ' 
-f1) ${CLASS}"
fi

# loop-AES arranges things so that /dev/loop/X can be our root device, but
# the initrds that Linux uses don't like that.
case ${GRUB_DEVICE} in
  /dev/loop/*|/dev/loop[0-9])
    GRUB_DEVICE=`losetup ${GRUB_DEVICE} | sed -e "s/^[^(]*(\([^)]\+\)).*/\1/"`
  ;;
esac

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}
fi

linux_entry ()
{
  os="$1"
  version="$2"
  xen_version="$3"
  recovery="$4"
  args="$5"
  xen_args="$6"
  if ${recovery} ; then
    title="$(gettext_quoted "%s, with Linux %s and XEN %s (recovery mode)")"
  else
    title="$(gettext_quoted "%s, with Linux %s and XEN %s")"
  fi
  printf "menuentry '${title}' ${CLASS} {\n" "${os}" "${version}" 
"${xen_version}"
  save_default_entry | sed -e "s/^/\t/"

  if [ -z "${prepare_boot_cache}" ]; then
    prepare_boot_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | 
sed -e "s/^/\t/")"
  fi
  printf '%s\n' "${prepare_boot_cache}"
  cat << EOF
        echo    '$(printf "$(gettext_quoted "Loading Linux %s ...")" 
${version})'
        multiboot       ${rel_xen_dirname}/${xen_basename} placeholder 
${xen_args}
        module  ${rel_dirname}/${basename} placeholder 
root=${linux_root_device_thisversion} ro ${args}
EOF
  if test -n "${initrd}" ; then
    cat << EOF
        echo    '$(gettext_quoted "Loading initial ramdisk ...")'
        module  ${rel_dirname}/${initrd}
EOF
  fi
  cat << EOF
}
EOF
}

linux_list=`for i in /boot/vmlinu[xz]-*jeremy* /vmlinu[xz]-*jeremy* ; do
        if grub_file_is_not_garbage "$i" ; then echo -n "$i " ; fi
      done`
xen_list=`for i in /boot/xen*; do
        if grub_file_is_not_garbage "$i" ; then echo -n "$i " ; fi
      done`
prepare_boot_cache=

while [ "x${xen_list}" != "x" ] ; do
    list="${linux_list}"
    current_xen=`version_find_latest $xen_list`
    xen_basename=`basename ${current_xen}`
    xen_dirname=`dirname ${current_xen}`
    rel_xen_dirname=`make_system_path_relative_to_its_root $xen_dirname`
    xen_version=`echo $xen_basename | sed -e "s,.gz$,,g;s,^xen-,,g"`
    while [ "x$list" != "x" ] ; do
        linux=`version_find_latest $list`
        echo "Found linux image: $linux" >&2
        basename=`basename $linux`
        dirname=`dirname $linux`
        rel_dirname=`make_system_path_relative_to_its_root $dirname`
        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}" \
            "initrd-${alt_version}.img" "initrd-${alt_version}"; do
            if test -e "${dirname}/${i}" ; then
                initrd="$i"
                break
            fi
        done
        if test -n "${initrd}" ; then
            echo "Found initrd image: ${dirname}/${initrd}" >&2
        else
    # "UUID=" magic is parsed by initrds.  Since there's no initrd, it can't 
work here.
            linux_root_device_thisversion=${GRUB_DEVICE}
        fi

        linux_entry "${OS}" "${version}" "${xen_version}" false \
            "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}" 
"${GRUB_CMDLINE_XEN} ${GRUB_CMDLINE_XEN_DEFAULT}"
        if [ "x${GRUB_DISABLE_LINUX_RECOVERY}" != "xtrue" ]; then
            linux_entry "${OS}" "${version}" "${xen_version}" true \
                "single ${GRUB_CMDLINE_LINUX}" "${GRUB_CMDLINE_XEN}"
        fi

        list=`echo $list | tr ' ' '\n' | grep -vx $linux | tr '\n' ' '`
    done
    xen_list=`echo $xen_list | tr ' ' '\n' | grep -vx $current_xen | tr '\n' ' 
'`
done

Attachment: signature.asc
Description: OpenPGP digital signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]