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. 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.e...@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 http://lists.gnu.org/mailman/listinfo/grub-devel