From mboxrd@z Thu Jan 1 00:00:00 1970 From: Bruce Edge Subject: /etc/grub.d/09-xen for generating grub.cfg for hypervisor boot entries. Date: Tue, 18 May 2010 15:30:14 -0700 Message-ID: Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1399490484==" Return-path: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org --===============1399490484== Content-Type: multipart/alternative; boundary=0003255628da9b34f50486e5e2d7 --0003255628da9b34f50486e5e2d7 Content-Type: text/plain; charset=ISO-8859-1 If this has already been done, please forgive me. However, if not, I'd like to submit this as a mechanism for generating a bootable grub2 stanza for hypervisors. As the /etc/grub.d/* files rely on defaults in /etc/default/grub, I added the following Xen specific variable: GRUB_CMDLINE_XEN_DEFAULT="console=com1 115200,8n1 dom0_mem=512M dom0_max_vcpus=1 dom0_vcpus_pin=true iommu=1,passthrough,no-intremap loglvl=all loglvl_guest=all loglevl=10 debug acpi=force apic=on apic_verbosity=verbose numa=on" The script itself is a hacked version of the10-linux that comes with grub2. This is 09-xen so it places it's boot entries ahead of the non-xen entries. The resulting grub.cfg entry looks like: ### BEGIN /etc/grub.d/09_xen ### insmod lvm set root=(system-dom0_0) menuentry "Xen osa-dom0 6.0.13-05, linux 2.6.32.12" { multiboot /boot/xen.gz /boot/xen.gz console=com1 115200,8n1 dom0_mem=512M dom0_max_vcpus=1 dom0_vcpus_pin=true iommu=1,passthrough,no-intremap loglvl=all loglvl_guest=all loglevl=10 debug acpi=force apic=on apic_verbosity=verbose numa=on module /boot/vmlinuz-2.6.32.12 /boot/vmlinuz-2.6.32.12 root=UUID=a3764d7d-6292-4f08-8ece-480e54c77229 ro earlyprintk=xen loglevel=10 debug acpi=force console=hvc0,115200n8 module /boot/initrd.img-2.6.32.12 /boot/initrd.img-2.6.32.12 } ### END /etc/grub.d/09_xen ### Note the duplication of the first params. I believe there's a bug that drops the 1st param so this could be changed later. #! /bin/sh -e 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" ; 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 /boot/xen.gz /boot/xen.gz $GRUB_CMDLINE_XEN_DEFAULT module ${rel_dirname}/${basename} ${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 -Bruce --0003255628da9b34f50486e5e2d7 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable If this has already been done, please forgive me. However, if not, I'd = like to submit this as a mechanism for generating a bootable grub2 stanza f= or hypervisors.

As the /etc/grub.d/* files rely on defau= lts in /etc/default/grub, I added the following Xen specific variable:

GRUB_CMDLINE_XEN_DEFAULT=3D"console=3Dcom1 115200,8= n1 dom0_mem=3D512M dom0_max_vcpus=3D1 dom0_vcpus_pin=3Dtrue iommu=3D1,passt= hrough,no-intremap loglvl=3Dall loglvl_guest=3Dall loglevl=3D10 debug acpi= =3Dforce apic=3Don apic_verbosity=3Dverbose numa=3Don"

The script itself is a hacked version of the10-li= nux that comes with grub2. This is 09-xen so it places it's boot entrie= s ahead of the non-xen entries.
The resulting grub.cfg entry look= s like:

### BEGIN /etc/grub.d/09_xen ###
=A0=A0i= nsmod lvm
=A0=A0set root=3D(system-dom0_0)
menuentry &q= uot;Xen osa-dom0 6.0.13-05, linux 2.6.32.12" {
=A0=A0 =A0 = =A0 =A0multiboot /boot/xen.gz /boot/xen.gz console=3Dcom1 115200,8n1 dom0_m= em=3D512M dom0_max_vcpus=3D1 dom0_vcpus_pin=3Dtrue iommu=3D1,passthrough,no= -intremap loglvl=3Dall loglvl_guest=3Dall loglevl=3D10 debug acpi=3Dforce a= pic=3Don apic_verbosity=3Dverbose numa=3Don
=A0=A0 =A0 =A0 =A0module /boot/vmlinuz-2.6.32.12 /boot/vmlinuz-2.6.32.= 12 root=3DUUID=3Da3764d7d-6292-4f08-8ece-480e54c77229 =A0ro earlyprintk=3Dx= en loglevel=3D10 debug acpi=3Dforce console=3Dhvc0,115200n8
=A0= =A0 =A0 =A0 =A0module /boot/initrd.img-2.6.32.12 /boot/initrd.img-2.6.32.12=
}
### END /etc/grub.d/09_xen ###

<= div>Note the duplication of the first params. I believe there's a bug t= hat drops the 1st param so this could be changed later.

#! /bin/sh -e

prefix=3D/usr
ex= ec_prefix=3D${prefix}
libdir=3D${exec_prefix}/lib
. ${l= ibdir}/grub/update-grub_lib

if [ "x${GRUB_DIS= TRIBUTOR}" =3D "x" ] ; then
=A0=A0OS=3DGNU/Linux
else
=A0=A0OS=3D"${GRUB_= DISTRIBUTOR}"
fi

# Source grub defa= ults
. /etc/default/grub

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

if [ "x${GRUB_DE= VICE_UUID}" =3D "x" ] || [ "x${GRUB_DISABLE_LINUX_UUID}= " =3D "xtrue" ] \
=A0=A0 =A0|| ! test -e "/de= v/disk/by-uuid/${GRUB_DEVICE_UUID}" ; then
=A0=A0LINUX_ROOT_DEVICE=3D${GRUB_DEVICE}
else
=A0= =A0LINUX_ROOT_DEVICE=3DUUID=3D${GRUB_DEVICE_UUID}
fi
test_gt ()
{
=A0=A0local a=3D`echo $1 | se= d -e "s,.*/vmlinu[zx]-,,g;s/[._-]\(pre\|rc\|test\|git\|old\)/~\1/g&quo= t;`
=A0=A0local b=3D`echo $2 | sed -e "s,.*/vmlinu[zx]-,,g;s/[._-]\(p= re\|rc\|test\|git\|old\)/~\1/g"`
=A0=A0if [ "x$b" = =3D "x" ] ; then
=A0=A0 =A0return 0
=A0=A0fi<= /div>
=A0=A0dpkg --compare-versions "$a" gt "$b"
=A0=A0return $?
}

find_latest ()
{
=A0=A0local a=3D""
=A0=A0for i in $= @ ; do
=A0=A0 =A0if test_gt "$i" "$a" ; then<= /div>
=A0=A0 =A0 =A0a=3D"$i"
=A0=A0 =A0fi
=A0=A0done
=A0=A0echo "$a"<= /div>
}

list=3D`for i in /boot/vmlinu[xz]-* /v= mlinu[xz]-* ; do
=A0=A0 =A0 =A0 =A0if grub_file_is_not_garbage &q= uot;$i" ; then echo -n "$i " ; fi
=A0=A0 =A0 =A0done`

while [ "x$list"= ; !=3D "x" ] ; do
=A0=A0linux=3D`find_latest $list`
=A0=A0echo "Found linux image: $linux" >&2
=A0=A0basename=3D`basename $linux`
=A0=A0dirname=3D`dirname $linux`
=A0=A0rel_dirname=3D`make_s= ystem_path_relative_to_its_root $dirname`
=A0=A0version=3D`echo $= basename | sed -e "s,^[^0-9]*-,,g"`
=A0=A0alt_version= =3D`echo $version | sed -e "s,\.old$,,g"`
=A0=A0linux_root_device_thisversion=3D"${LINUX_ROOT_DEVICE}"=

=A0=A0initrd=3D
=A0=A0for i in "in= itrd.img-${version}" "initrd-${version}.img" \
=A0= =A0 =A0 =A0 =A0 =A0 "initrd.img-${alt_version}" "initrd-${al= t_version}.img"; do
=A0=A0 =A0if test -e "${dirname}/${i}" ; then
=A0= =A0 =A0 =A0initrd=3D"$i"
=A0=A0 =A0 =A0break
= =A0=A0 =A0fi
=A0=A0done
=A0=A0if test -n "${initrd= }" ; then
=A0=A0 =A0echo "Found initrd image: ${dirname= }/${initrd}" >&2
=A0=A0else
=A0=A0 =A0# "UUID=3D" magic is parsed b= y initrds. =A0Since there's no initrd, it can't work here.
=A0=A0 =A0linux_root_device_thisversion=3D${GRUB_DEVICE}
=A0=A0= fi

=A0=A0cat << EOF
=A0=A0insmod lvm
=A0=A0set = root=3D(system-dom0_0)
menuentry "Xen ${OS}, linux ${version= }" {
=A0=A0 =A0 =A0 =A0multiboot /boot/xen.gz /boot/xen.gz $= GRUB_CMDLINE_XEN_DEFAULT
=A0=A0 =A0 =A0 =A0module ${rel_dirname}/${basename} ${rel_dirname}/${b= asename} root=3D${linux_root_device_thisversion} $GRUB_CMDLINE_LINUX_DEFAUL= T
EOF
=A0=A0if test -n "${initrd}" ; then
=A0=A0 =A0cat << EOF
=A0=A0 =A0 =A0 =A0module ${rel_dirname}/${initrd} ${rel_dirname}/${ini= trd}
EOF
=A0=A0fi
=A0=A0cat << EOF
}
EOF

=A0=A0list=3D`echo $list | t= r ' ' '\n' | grep -vx $linux | tr '\n' ' '`=
done


-Bruce
--0003255628da9b34f50486e5e2d7-- --===============1399490484== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel --===============1399490484==--