There are two types of xen enabled kernel in linux, one is called
xenlinux which is older and can only boot on xen domain but not on any
real hardware without xen hypervisor. The other is called pvops which
can boot on xen domain as well as real hardware.

This patch is to prevent booting xenlinux kernel on real hardware by
filtering it out from boot menu. If not the error will show up when
attempting to boot it.

"Loading Linux xen ..."
error: invalid magic number
Loading initial ramdisk
error: you need to load the kernel first"

This patch achieves it by checking the host type, then disable xenlinux
kernel from booting on hosts that is not xen pv domU, and meanwhile
allow xen pvops kernel to boot.
---
 util/grub.d/10_linux.in |   24 ++++++++++++++++++++++++
 1 files changed, 24 insertions(+), 0 deletions(-)

diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in
index d2e2a8f..b055ccc 100644
--- a/util/grub.d/10_linux.in
+++ b/util/grub.d/10_linux.in
@@ -207,6 +207,30 @@ while [ "x$list" != "x" ] ; do
     fi
   done
 
+  # check if host is xen pv domU
+  if [ ! -e /proc/xen/xsd_port -a -e /proc/xen ]; then
+    dmi=/sys/class/dmi/id
+    if [ -r "${dmi}/product_name" -a -r "${dmi}/sys_vendor" ]; then
+      product_name=`cat ${dmi}/product_name`
+      sys_vendor=`cat ${dmi}/sys_vendor`
+      if test "${sys_vendor}" = "Xen" -a "${product_name}" = "HVM domU"; then
+       # host is xen HVM guest
+       xen_pv_domU=false
+      fi
+    fi
+  else
+    xen_pv_domU=false
+  fi
+
+  if test "$xen_pv_domU" = "false" ; then
+    # prevent xen kernel without pv_opt support from booting
+    if (grep -qx "CONFIG_XEN=y" "${config}" 2> /dev/null && ! grep -qx 
"CONFIG_PARAVIRT=y" "${config}" 2> /dev/null); then
+      echo "Skip xenlinux kernel $linux" >&2
+      list=`echo $list | tr ' ' '\n' | grep -vx $linux | tr '\n' ' '`
+      continue
+    fi
+  fi
+
   initramfs=
   if test -n "${config}" ; then
       initramfs=`grep CONFIG_INITRAMFS_SOURCE= "${config}" | cut -f2 -d= | tr 
-d \"`
-- 
1.7.3.4


_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to