From: "Vladimir 'φ-coder/phcoder' Serbinenko" <phcoder@gmail.com>
To: The development of GNU GRUB <grub-devel@gnu.org>
Subject: Re: update-grub & Xen boot stanza generation
Date: Fri, 21 May 2010 02:35:48 +0200 [thread overview]
Message-ID: <4BF5D564.6090701@gmail.com> (raw)
In-Reply-To: <AANLkTinAUJcvAdvzZQNpvRAVDUkEf_PMyZe3EGFVqeyH@mail.gmail.com>
[-- Attachment #1.1: Type: text/plain, Size: 7541 bytes --]
Bruce Edge wrote:
> 2010/5/20 Vladimir 'φ-coder/phcoder' Serbinenko <phcoder@gmail.com
> <mailto:phcoder@gmail.com>>
>
> 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), bruce.edge@lsi.com
> <mailto:bruce.edge@lsi.com>
> > <mailto:bruce.edge@lsi.com <mailto:bruce.edge@lsi.com>>
> > # 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
> > Grub-devel@gnu.org <mailto:Grub-devel@gnu.org>
> > http://lists.gnu.org/mailman/listinfo/grub-devel
> >
>
>
> --
> Regards
> Vladimir 'φ-coder/phcoder' Serbinenko
>
>
>
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org <mailto:Grub-devel@gnu.org>
> http://lists.gnu.org/mailman/listinfo/grub-devel
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> http://lists.gnu.org/mailman/listinfo/grub-devel
>
--
Regards
Vladimir 'φ-coder/phcoder' Serbinenko
[-- Attachment #1.2: 20_linux_xen.in --]
[-- Type: text/plain, Size: 4688 bytes --]
#! /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/>.
prefix=@prefix@
exec_prefix=@exec_prefix@
bindir=@bindir@
libdir=@libdir@
. ${libdir}/grub/grub-mkconfig_lib
export TEXTDOMAIN=@PACKAGE@
export TEXTDOMAINDIR=@localedir@
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 #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 293 bytes --]
next prev parent reply other threads:[~2010-05-21 0:36 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-05-20 23:36 update-grub & Xen boot stanza generation Bruce Edge
2010-05-20 23:45 ` Seth Goldberg
2010-05-20 23:55 ` Bruce Edge
2010-05-20 23:59 ` Seth Goldberg
2010-05-21 1:58 ` Bruce Edge
2010-05-21 6:58 ` Grégoire Sutre
2010-05-21 15:14 ` Bruce Edge
2010-05-20 23:53 ` Vladimir 'φ-coder/phcoder' Serbinenko
2010-05-20 23:57 ` Bruce Edge
2010-05-21 0:35 ` Vladimir 'φ-coder/phcoder' Serbinenko [this message]
2010-05-24 4:48 ` Joey Korkames
2010-05-24 16:45 ` Isaac Dupree
2010-05-24 17:00 ` Bruce Edge
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4BF5D564.6090701@gmail.com \
--to=phcoder@gmail.com \
--cc=grub-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.