星期三, 十月 17, 2012

Debian6下安装Xen4后GRUB2菜单冗余项问题解决


Debian 6默认的bootloader是grub2,其启动菜单由一系列的/etc/grub.d中的脚本自动生成。其中默认包含10_linux脚本用来枚举本地linux内核生成启动项,安装xen后,20_linux_xen添加了自动枚举xen dom0内核的功能。但是,xen安装的dom0内核也能被10_linux检测到,于是启动菜单里dom0相关的启动项会出现两遍,而由于10_linux生成的项没有启动xen本身,所以这些多余的项目存在没有意义,需要将其删除。
让10_linux仿照20_linux_xen脚本用内核对应的config-XXXversion文件信息判断内核是否是dom0内核,如果是的话,则从生成列表中将其剔除,改动的代码如下:
--- 10_linux.bak 2012-10-16 22:30:43.893612434 +0800
+++ 10_linux 2012-10-17 09:16:09.192399881 +0800
@@ -51,6 +51,18 @@
   LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID}
 fi

+# check kernel's flavor to prevent xen kernel from booting natively without hypervisor
+is_not_xen ()
+{
+ basename=$(basename $1)
+ version=$(echo $basename | sed -e "s,^[^0-9]*-,,g") 
+ if grep -qx "CONFIG_XEN_DOM0=y" /boot/config-${version} ; then
+  false;
+ else
+  true;
+ fi
+}
+
 linux_entry ()
 {
   os="$1"
@@ -95,7 +107,7 @@
 }

 list=`for i in /boot/vmlinu[zx]-* /vmlinu[zx]-* ; do
-        if grub_file_is_not_garbage "$i" ; then echo -n "$i " ; fi
+        if grub_file_is_not_garbage "$i" && is_not_xen "$i" ; then echo -n "$i " ; fi
       done`
 prepare_boot_cache=

没有评论: