tags 343076 patch
thanks

Attached is a patch to add Xen support.

Regards
Alastair

--- /sbin/update-grub	2006-04-06 06:33:15.000000000 +0100
+++ update-grub.new	2006-06-20 16:05:29.000000000 +0100
@@ -326,6 +326,9 @@
 # alternatives
 	defoptions="quiet splash"
 
+# Xen kernel options to use with the default xen boot options
+xenoptions="console=tty0 quiet"
+
 # options to use with the alternative boot options
 	altoptions="(recovery mode) single"
 
@@ -621,7 +624,43 @@
 	echo >> $buffer
 }
 
+write_xen_kernel_entry()
+{
+	hypervisor_version=$1
+	hypervisor=$2
+	kernel_version=$3
+	grub_root_device=$4
+	kernel=$5
+	kernel_options=$6
+	recovery_suffix=$7
+	initrd=$8
+	savedefault=$9
+
+	echo -n "title		Xen $hypervisor_version / XenLinux $kernel_version " >> $buffer
+	echo >> $buffer
+
+        echo "root		$grub_root_device" >> $buffer
 
+	echo "kernel		$hypervisor" >> $buffer
+
+        echo -n "module		$kernel $kernel_options"  >> $buffer
+        if [ -n "$recovery_desc" ]; then
+                echo -n " $recovery_suffix"  >> $buffer
+        fi
+        echo >> $buffer
+
+
+       if [ -n "$initrd" ]; then
+                echo "module		$initrd" >> $buffer
+        fi
+
+        if test x"$savedefault" = x"true" ; then
+                echo "savedefault" >> $buffer
+        fi
+        echo "boot" >> $buffer
+        echo >> $buffer
+}
+	
 echo -n "Testing for an existing GRUB menu.list file ... "
 
 # Test if our menu file exists
@@ -683,6 +722,9 @@
 defoptions=$(GetMenuOpt "nonaltoptions" "$defoptions")
 defoptions=$(GetMenuOpt "defoptions" "$defoptions")
 
+# Extract Xen kernel options
+xenoptions=$(GetMenuOpt "xenoptions" "$xenoptions")
+
 # Extract the howmany value
 howmany=$(GetMenuOpt "howmany" "$howmany")
 
@@ -740,6 +782,10 @@
 echo "# defoptions=$defoptions" >> $buffer
 echo >> $buffer
 
+echo "## Xen options top use with the default Xen boot kernel option " >> $buffer
+echo "# xenoptions=$xenoptions" >> $buffer
+echo >> $buffer
+
 echo "## altoption boot targets option" >> $buffer
 echo "## multiple altoptions lines are allowed" >> $buffer
 echo "## e.g. altoptions=(extra menu suffix) extra boot options" >> $buffer
@@ -795,22 +841,48 @@
 fi
 
 
+xenKernels=""
+for ver in $(grep CONFIG_XEN_PRIVILEGED_GUEST=y /boot/config* | sed -e 's/\/boot\/config-\([^:]*\):[^:]*/\1/' ) ; do
+  # ver is a kernel version
+  kern="/boot/vmlinuz-$ver"
+  if [ -r $kern ] ; then
+       newerKernels=""
+       for i in $xenKernels ; do
+                res=$(CompareVersions "$kern" "$i")
+                if [ "$kern" != "" ] && [ "$res" -gt 0 ] ; then
+                        newerKernels="$newerKernels $kern $i"
+                        kern=""
+                else
+                        newerKernels="$newerKernels $i"
+                fi
+        done
+        if [ "$kern" != "" ] ; then
+                newerKernels="$newerKernels $kern"
+        fi
+        xenKernels="$newerKernels"
+    fi
+done
+
 sortedKernels=""
-for kern in $(/bin/ls -1vr /boot | grep -v "dpkg-*" | grep "^vmlinuz-") ; do
+for kern in $(/bin/ls -1vr /boot | grep -v "dpkg-*" | grep -v "xen" | grep "^vmlinuz-") ; do
 	# found a kernel
+        if `echo "$xenKernels" | grep -q $kern` ; then
+          continue
+        fi
+        # not a Xen kernel
         kern="/boot/$kern"
 	newerKernels=""
 	for i in $sortedKernels ; do
-		res=$(CompareVersions "$kern" "$i")
-		if [ "$kern" != "" ] && [ "$res" -gt 0 ] ; then
-			newerKernels="$newerKernels $kern $i"
-			kern=""
-		else
-			newerKernels="$newerKernels $i"
-		fi
+	    res=$(CompareVersions "$kern" "$i")
+	    if [ "$kern" != "" ] && [ "$res" -gt 0 ] ; then
+		newerKernels="$newerKernels $kern $i"
+	 	kern=""
+	    else
+		newerKernels="$newerKernels $i"
+	    fi
 	done
 	if [ "$kern" != "" ] ; then
-		newerKernels="$newerKernels $kern"
+	    newerKernels="$newerKernels $kern"
 	fi
 	sortedKernels="$newerKernels"
 done
@@ -822,6 +894,14 @@
 	sortedKernels="/boot/vmlinuz $sortedKernels"
 fi
 
+hypervisors=""
+for hyp in $(ls /boot | egrep "xen-.*.gz" ) ; do
+   if [ ! -h /boot/$hyp ] ; then
+        hypervisors="$hypervisors $hyp"
+   fi
+done
+echo "hypervisors $hypervisors"
+
 # figure out where grub looks for the kernels at boot time
 kernel_dir=/boot
 if [ -n "$boot_device" ] ; then
@@ -910,6 +990,40 @@
 	fi
 done
 
+# Now the Xen entries
+for hyp in $hypervisors ; do
+
+    hypName=$(basename $hyp)
+    hypVersion=$(echo $hypName | sed -e 's/xen-//' | sed -e 's/.gz//')
+    hypervisor=/boot/$hyp
+   
+    for kern in $xenKernels ; do
+                if test ! x"$howmany" = x"all" ; then
+        	        if [ $counter -gt $howmany ] ; then
+                	        break
+                	fi
+		fi
+        	kernelName=$(basename $kern)
+	
+        	kernelVersion=$(echo $kernelName | sed -e 's/vmlinuz//')
+        	initrdName=$(FindInitrdName "/boot" "$kernelVersion")
+        	initrd=""
+
+        	kernel=$kernel_dir/$kernelName
+        	if [ -n "$initrdName" ] ; then
+               	    initrd=$kernel_dir/$initrdName
+        	fi
+
+        	echo "Found Xen hypervisor $hypVersion,  kernel: $kernel"
+
+        	kernelVersion=$(echo $kernelVersion | sed -e 's/^-//')
+
+		write_xen_kernel_entry "$hypVersion" "$hypervisor" "$kernelVersion" \
+		  "$grub_root_device" "$kernel" "$currentOpt $xenoptions" "" "$initrd" "false"
+	done
+done
+
+    
 memtest86names="memtest86 memtest86+"
 
 if test ! x"$memtest86" = x"false" ; then

Reply via email to