[Top][All Lists]
[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
signature.asc
Description: OpenPGP digital signature
Re: update-grub & Xen boot stanza generation, Vladimir 'φ-coder/phcoder' Serbinenko, 2010/05/20