grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] fix booting xenlinux kerenl error not on a xen domain


From: Michael Chang
Subject: [PATCH] fix booting xenlinux kerenl error not on a xen domain
Date: Thu, 18 Sep 2014 16:58:36 +0800

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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]