From b411dc88b46890400a2e1ba0aa8650e00f738c23 Mon Sep 17 00:00:00 2001 From: Michael Chang Date: Thu, 19 Jul 2012 18:43:55 +0800 Subject: [PATCH] fix menu in xen host server References: bnc#771689, bnc#757895 Patch-Mainline: no When system is configred as "Xen Virtual Machines Host Server", the grub2 menu is not well organized. We could see some issues on it. - Many duplicated xen entries generated by links to xen hypervisor - Non bootable kernel entries trying to boot xen kernel natively - The -dbg xen hypervisor takes precedence over release version This patch fixes above three issues. --- util/grub-mkconfig_lib.in | 5 +++++ util/grub.d/10_linux.in | 12 ++++++++++-- util/grub.d/20_linux_xen.in | 6 ++++-- 3 files changed, 19 insertions(+), 4 deletions(-) Index: grub-2.00/util/grub-mkconfig_lib.in =================================================================== --- grub-2.00.orig/util/grub-mkconfig_lib.in +++ grub-2.00/util/grub-mkconfig_lib.in @@ -235,6 +235,11 @@ version_test_gt () *.old:*.old) ;; *.old:*) version_test_gt_a="`echo -n "$version_test_gt_a" | sed -e 's/\.old$//'`" ; version_test_gt_cmp=gt ;; *:*.old) version_test_gt_b="`echo -n "$version_test_gt_b" | sed -e 's/\.old$//'`" ; version_test_gt_cmp=ge ;; +# bnc#757895 - Grub2 menu items incorrect when "Xen Virtual Machines Host Server" selected +# The dbg version should be placed after release version + dbg-*:dbg-*) ;; + dbg-*:*) version_test_gt_a="" ;; + *:dbg-*) version_test_gt_b="" ;; esac version_test_numeric "$version_test_gt_a" "$version_test_gt_cmp" "$version_test_gt_b" return "$?" Index: grub-2.00/util/grub.d/10_linux.in =================================================================== --- grub-2.00.orig/util/grub.d/10_linux.in +++ grub-2.00/util/grub.d/10_linux.in @@ -150,15 +150,37 @@ EOF EOF } +# bnc#757895 - Grub2 menu items incorrect when "Xen Virtual Machines Host Server" selected +# check kernel's flavor to prevent xen kernel from booting natively without hypervisor +# bnc#825528 - grub2-mkconfig doesn't find kernel in xen domU +# check xen kernel in domU and process it +is_not_xen_kernel_in_dom0 () +{ + flavor=`echo $1 | sed -e "s,.*-,,g"` + + if [ "x${flavor}" = "xxen" ] ; then + # Determining Virtual Machine Identities + if [ -e /proc/xen -a ! -e /proc/xen/xsd_port ]; then + # We're in DomU + return 0 + else + # We're in Dom0 or No Xen hypervisor present at all + return 1 + fi + fi + + return 0 +} + machine=`uname -m` case "x$machine" in xi?86 | xx86_64) list=`for i in /boot/vmlinuz-* /vmlinuz-* /boot/kernel-* ; do - if grub_file_is_not_garbage "$i" ; then echo -n "$i " ; fi + if grub_file_is_not_garbage "$i" && is_not_xen_kernel_in_dom0 "$i" ; then echo -n "$i " ; fi done` ;; *) list=`for i in /boot/vmlinuz-* /boot/vmlinux-* /vmlinuz-* /vmlinux-* /boot/kernel-* ; do - if grub_file_is_not_garbage "$i" ; then echo -n "$i " ; fi + if grub_file_is_not_garbage "$i" && is_not_xen_kernel_in_dom0 "$i" ; then echo -n "$i " ; fi done` ;; esac Index: grub-2.00/util/grub.d/20_linux_xen.in =================================================================== --- grub-2.00.orig/util/grub.d/20_linux_xen.in +++ grub-2.00/util/grub.d/20_linux_xen.in @@ -171,8 +171,10 @@ file_is_not_sym () { esac } -xen_list=`for i in /boot/xen*; do - if grub_file_is_not_garbage "$i" && file_is_not_sym "$i" ; then echo -n "$i " ; fi +# bnc#757895 - Grub2 menu items incorrect when "Xen Virtual Machines Host Server" selected +# wildcard expasion with correct suffix (.gz) and exclude symlinks for not generating many duplicated menu entries +xen_list=`for i in /boot/xen*.gz; do + if grub_file_is_not_garbage "$i" && test ! -L "$i" ; then echo -n "$i " ; fi done` prepare_boot_cache= boot_device_id=