Package: grub
Version: 0.97-29
Severity: wishlist
User: [EMAIL PROTECTED]
Usertags: origin-ubuntu ubuntu-patch hardy
Hi guys,
Given bugs like #460177, I'm sure you're well aware that the current
update-grub behavior causes no small amount of consternation for users who
don't notice the magic comments and try to edit their boot configurations
directly. At the last Ubuntu Developer Summit, it was decided that we should
do something about this for Ubuntu 8.04.[1] Since grub2 is not yet ready to
be a default bootloader, that means finding a way to clean up update-grub's
behavior in grub. Of the available solutions considered, we decided that
using ucf made the most sense, as a minimally-intrusive change that would at
least allow users to be notified that update-grub wanted to overwrite their
changes.
Attach is a preliminary patch that accomplishes this. I don't consider it
final since there is still an outstanding feature enhancement request on ucf
to let us configure the debconf prompts (bug #456241), but I've tested it
with both xen and non-xen configs and it works sensibly for me so far, so at
this point I'd like to get your input on whether this is a change that could
be accepted into the Debian package as well.
Cheers,
--
Steve Langasek Give me a lever long enough and a Free OS
Debian Developer to set it on, and I can move the world.
Ubuntu Developer http://www.debian.org/
[EMAIL PROTECTED] [EMAIL PROTECTED]
[1]
https://blueprints.launchpad.net/ubuntu/+spec/grub-configuration-improvements
A
diff -u grub-0.97/debian/update-grub grub-0.97/debian/update-grub
--- grub-0.97/debian/update-grub
+++ grub-0.97/debian/update-grub
@@ -2,6 +2,7 @@
#
# Insert a list of installed kernels in a grub config file
# Copyright 2001 Wichert Akkerman <[EMAIL PROTECTED]>
+# Copyright 2007, 2008 Canonical Ltd.
#
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
@@ -22,6 +23,7 @@
# David B.Harris <[EMAIL PROTECTED]>
# Marc Haber <[EMAIL PROTECTED]>
# Crispin Flowerday <[EMAIL PROTECTED]>
+# Steve Langasek <[EMAIL PROTECTED]>
# Abort on errors
set -e
@@ -266,6 +268,9 @@
menu_file_basename=menu.lst
menu_file=$grub_dir/$menu_file_basename
+# Full path to the menu.lst fragment used for ucf management
+ucf_menu_file=/var/run/grub/$menu_file_basename
+
# Full path to the default file
default_file_basename=default
default_file=$grub_dir/$default_file_basename
@@ -410,6 +415,9 @@
startopt="## ## Start Default Options ##"
endopt="## ## End Default Options ##"
+# path to grub2
+grub2name="/boot/grub/core.img"
+
# Extract options from config file
ExtractMenuOpt()
{
@@ -670,6 +678,179 @@
echo >> $buffer
}
+## write out the kernel entries
+output_kernel_list() {
+ counter=0
+
+ # Xen entries first.
+ 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
+
+ kernelVersion=$(echo $kernelVersion | sed -e 's/^-//')
+ currentOpt=$(get_kernel_opt $kernelVersion)
+
+ hypervisorVersions=$(FindXenHypervisorVersions "$kernelVersion")
+
+ found=
+ for hypervisorVersion in $hypervisorVersions; do
+ hypervisor="$kernel_dir/xen-$hypervisorVersion.gz"
+ if [ -e "$hypervisor" ]; then
+ found=1
+
+ echo "Found Xen hypervisor $hypervisorVersion, kernel: $kernel" >&2
+
+ write_kernel_entry "$kernelVersion" '' '' "$grub_root_device" \
+ "$kernel" "$currentOpt $xenkopt" '' "$initrd" true '' \
+ Xen "$hypervisor" "$hypervisorVersion" "$xenhopt"
+ counter=$(($counter + 1))
+ fi
+ done
+
+ if [ -z $found ]; then
+ for hypervisor in $hypervisors; do
+ hypVersion=`basename "$hypervisor" .gz | sed s%xen-%%`
+
+ echo "Found Xen hypervisor $hypVersion, kernel: $kernel" >&2
+
+ write_kernel_entry "$kernelVersion" '' '' "$grub_root_device" \
+ "$kernel" "$currentOpt $xenkopt" '' "$initrd" true '' \
+ Xen "$kernel_dir/$hypervisor" "$hypVersion" "$xenhopt"
+ counter=$(($counter + 1))
+ done
+ fi
+ done
+
+ for kern in $sortedKernels ; do
+ counter=$(($counter + 1))
+ 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 kernel: $kernel" >&2
+
+ if [ "$kernelName" = "vmlinuz" ]; then
+ if [ -L "/boot/$kernelName" ]; then
+ kernelVersion=`readlink -f "/boot/$kernelName"`
+ kernelVersion=$(echo $kernelVersion | sed -e 's/.*vmlinuz-//')
+ kernelVersion="$kernelVersion Default"
+ else
+ kernelVersion="Default"
+ fi
+ fi
+ if [ "$kernelName" = "vmlinuz.old" ]; then
+ if [ -L "/boot/$kernelName" ]; then
+ kernelVersion=`readlink -f "/boot/$kernelName"`
+ kernelVersion=$(echo $kernelVersion | sed -e 's/.*vmlinuz-//')
+ kernelVersion="$kernelVersion Previous"
+ else
+ kernelVersion="Previous"
+ fi
+ fi
+ kernelVersion=$(echo $kernelVersion | sed -e 's/^-//')
+
+ currentOpt=$(get_kernel_opt $kernelVersion)
+
+ do_lockold=$lockold
+ # do not lockold for the first entry
+ [ $counter -eq 1 ] && do_lockold=false
+
+ write_kernel_entry "$kernelVersion" "" "" "$grub_root_device" "$kernel" \
+ "$currentOpt $defoptions" "" "$initrd" true "$do_lockold"
+
+ # insert the alternative boot options
+ if test ! x"$alternative" = x"false" ; then
+ # for each altoptions line do this stuff
+ sed -ne 's/# altoptions=\(.*\)/\1/p' $buffer | while read line; do
+ descr=$(echo $line | sed -ne 's/\(([^)]*)\)[[:space:]]\(.*\)/\1/p')
+ suffix=$(echo $line | sed -ne 's/\(([^)]*)\)[[:space:]]\(.*\)/\2/p')
+
+ test x"$lockalternative" = x"true" && do_lockold=false
+ write_kernel_entry "$kernelVersion" "$descr" "$lockalternative" \
+ "$grub_root_device" "$kernel" "$currentOpt" "$suffix" "$initrd" \
+ "true" "$do_lockold"
+ done
+ fi
+ done
+
+ if test -f $grub2name ; then
+ echo "Found GRUB 2: $grub2name" >&2
+ cat >> $buffer << EOF
+title Chainload into GRUB 2
+root $grub_root_device
+kernel $grub2name
+savedefault
+
+EOF
+ fi
+
+ memtest86names="memtest86 memtest86+"
+
+ if test ! x"$memtest86" = x"false" ; then
+ for name in $memtest86names ; do
+ if test -f "/boot/$name.bin" ; then
+ kernelVersion="$name"
+ kernel="$kernel_dir/$name.bin"
+ currentOpt=
+ initrd=
+
+ echo "Found kernel: $kernel" >&2
+
+ write_kernel_entry "$kernelVersion" "" "" "$grub_root_device" \
+ "$kernel" "$currentOpt" "" "$initrd" "false" ""
+ fi
+ done
+ fi
+
+ echo $end >> $buffer
+}
+
+ucf_update_kernels() {
+ local target; target="$1"
+ local buffer; buffer="$2"
+
+ sed -ni -e"/$endopt/,/$end/p" "$buffer"
+
+ sed -n -e"/$endopt/,/$end/p" < $menu > $ucf_menu_file
+
+ ucf --debconf-ok --three-way "$buffer" $ucf_menu_file
+ rm "$buffer"
+
+ # now re-merge the ucf results with the target file
+ sed -i -e "/^$endopt/,/^$end/ {
+ /^$endopt/r $ucf_menu_file
+ d
+ }
+ " $target
+
+ rm -f $ucf_menu_file ${ucf_menu_file}.ucf-old
+}
+
echo -n "Testing for an existing GRUB $menu_file_basename file ... " >&2
@@ -876,6 +1057,56 @@
fi
+hypervisors=""
+for hyp in /boot/xen-*.gz; do
+ if [ ! -h "$hyp" ] && [ -f "$hyp" ]; then
+ hypervisors="$hypervisors `basename "$hyp"`"
+ fi
+done
+
+# figure out where grub looks for the kernels at boot time
+kernel_dir=/boot
+if [ -n "$boot_device" ] ; then
+ kernel_dir=
+fi
+
+
+# We need a static path to use for the ucf registration; since we're not
+# using the full menu.lst file (maybe we should, just copying it around?
+# C.f. discussion with Manoj), create a directory in a fixed location
+# even though we're not treating the file in that location as
+# persistent.
+mkdir -p /var/run/grub
+
+# The first time ucf sees the file, we can only assume any difference
+# between the magic comments and the kernel options is a result of local
+# mods, so this will result in a ucf prompt for anyone whose first
+# invocation of update-grub is as a result of updating the magic comments.
+if ! ucfq grub | grep -q $ucf_menu_file; then
+ otherbuffer=$(tempfile)
+ cat $buffer > $otherbuffer
+
+ sortedKernels=`sed -n -e "
+ /$endopt/,/$end/ {
+ s/^kernel[[:space:]]\+\([^[:space:]]\+\).*/\1/p
+ }" < $menu | grep -vE "memtest86|$grub2name|xen" | uniq`
+ xenKernels=`sed -n -e "
+ /$endopt/,/$end/ {
+ s/^module[[:space:]]\+\([^[:space:]]*vmlinuz[^[:space:]]\+\).*/\1/p
+ }" < $menu | uniq`
+
+ savebuffer="$buffer"
+ buffer="$otherbuffer"
+ output_kernel_list
+ buffer="$savebuffer"
+
+ ucf_update_kernels "$menu" "$otherbuffer"
+
+ # all done, now register it
+ ucfr grub $ucf_menu_file
+fi
+
+
xenKernels=""
for ver in `grep -l CONFIG_XEN_PRIVILEGED_GUEST=y /boot/config* | sed -e s%/boot/config-%%`; do
# ver is a kernel version
@@ -942,19 +1173,6 @@
sortedKernels="/boot/vmlinuz $sortedKernels"
fi
-hypervisors=""
-for hyp in /boot/xen-*.gz; do
- if [ ! -h "$hyp" ] && [ -f "$hyp" ]; then
- hypervisors="$hypervisors `basename "$hyp"`"
- fi
-done
-
-# figure out where grub looks for the kernels at boot time
-kernel_dir=/boot
-if [ -n "$boot_device" ] ; then
- kernel_dir=
-fi
-
#Finding the value the default line
use_grub_set_default="false"
if test "$updatedefaultentry" = "true" ; then
@@ -987,157 +1205,12 @@
;;
esac
-## heres where we start writing out the kernel entries
-counter=0
-
-# Xen entries first.
-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
-
- kernelVersion=$(echo $kernelVersion | sed -e 's/^-//')
- currentOpt=$(get_kernel_opt $kernelVersion)
-
- hypervisorVersions=$(FindXenHypervisorVersions "$kernelVersion")
-
- found=
- for hypervisorVersion in $hypervisorVersions; do
- hypervisor="$kernel_dir/xen-$hypervisorVersion.gz"
- if [ -e "$hypervisor" ]; then
- found=1
-
- echo "Found Xen hypervisor $hypervisorVersion, kernel: $kernel" >&2
+output_kernel_list
- write_kernel_entry "$kernelVersion" '' '' "$grub_root_device" \
- "$kernel" "$currentOpt $xenkopt" '' "$initrd" true '' \
- Xen "$hypervisor" "$hypervisorVersion" "$xenhopt"
- counter=$(($counter + 1))
- fi
- done
-
- if [ -z $found ]; then
- for hypervisor in $hypervisors; do
- hypVersion=`basename "$hypervisor" .gz | sed s%xen-%%`
-
- echo "Found Xen hypervisor $hypVersion, kernel: $kernel" >&2
-
- write_kernel_entry "$kernelVersion" '' '' "$grub_root_device" \
- "$kernel" "$currentOpt $xenkopt" '' "$initrd" true '' \
- Xen "$kernel_dir/$hypervisor" "$hypVersion" "$xenhopt"
- counter=$(($counter + 1))
- done
- fi
-done
-
-for kern in $sortedKernels ; do
- counter=$(($counter + 1))
- 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 kernel: $kernel" >&2
-
- if [ "$kernelName" = "vmlinuz" ]; then
- if [ -L "/boot/$kernelName" ]; then
- kernelVersion=`readlink -f "/boot/$kernelName"`
- kernelVersion=$(echo $kernelVersion | sed -e 's/.*vmlinuz-//')
- kernelVersion="$kernelVersion Default"
- else
- kernelVersion="Default"
- fi
- fi
- if [ "$kernelName" = "vmlinuz.old" ]; then
- if [ -L "/boot/$kernelName" ]; then
- kernelVersion=`readlink -f "/boot/$kernelName"`
- kernelVersion=$(echo $kernelVersion | sed -e 's/.*vmlinuz-//')
- kernelVersion="$kernelVersion Previous"
- else
- kernelVersion="Previous"
- fi
- fi
- kernelVersion=$(echo $kernelVersion | sed -e 's/^-//')
-
- currentOpt=$(get_kernel_opt $kernelVersion)
-
- do_lockold=$lockold
- # do not lockold for the first entry
- [ $counter -eq 1 ] && do_lockold=false
-
- write_kernel_entry "$kernelVersion" "" "" "$grub_root_device" "$kernel" \
- "$currentOpt $defoptions" "" "$initrd" "true" "$do_lockold"
-
- # insert the alternative boot options
- if test ! x"$alternative" = x"false" ; then
- # for each altoptions line do this stuff
- sed -ne 's/# altoptions=\(.*\)/\1/p' $buffer | while read line; do
- descr=$(echo $line | sed -ne 's/\(([^)]*)\)[[:space:]]\(.*\)/\1/p')
- suffix=$(echo $line | sed -ne 's/\(([^)]*)\)[[:space:]]\(.*\)/\2/p')
-
- test x"$lockalternative" = x"true" && do_lockold=false
- write_kernel_entry "$kernelVersion" "$descr" "$lockalternative" \
- "$grub_root_device" "$kernel" "$currentOpt" "$suffix" "$initrd" \
- "true" "$do_lockold"
-
- done
- fi
-done
-
-grub2name="/boot/grub/core.img"
-if test -f $grub2name ; then
- echo "Found GRUB 2: $grub2name" >&2
- cat >> $buffer << EOF
-title Chainload into GRUB 2
-root $grub_root_device
-kernel $grub2name
-savedefault
-
-EOF
-fi
-
-memtest86names="memtest86 memtest86+"
-
-if test ! x"$memtest86" = x"false" ; then
- for name in $memtest86names ; do
- if test -f "/boot/$name.bin" ; then
- kernelVersion="$name"
- kernel="$kernel_dir/$name.bin"
- currentOpt=
- initrd=
-
- echo "Found kernel: $kernel" >&2
-
- write_kernel_entry "$kernelVersion" "" "" "$grub_root_device" \
- "$kernel" "$currentOpt" "" "$initrd" "false" ""
- fi
- done
-fi
+otherbuffer=$(tempfile)
+cat $buffer > $otherbuffer
-echo $end >> $buffer
+ucf_update_kernels "$buffer" "$otherbuffer"
echo -n "Updating $menu ... " >&2
# Insert the new options into the menu
diff -u grub-0.97/debian/changelog grub-0.97/debian/changelog
--- grub-0.97/debian/changelog
+++ grub-0.97/debian/changelog
@@ -1,3 +1,14 @@
+grub (0.97-29.1) unstable; urgency=low
+
+ * Non-maintainer upload.
+ * debian/update-grub: use ucf to record changes to the autogenerated
+ kernel list
+ * debian/grub.postinst: run update-grub on upgrade from pre-ucf versions,
+ so that we get a registered copy of the file immediately and not just
+ the next time a kernel is installed.
+
+ -- Steve Langasek <[EMAIL PROTECTED]> Thu, 17 Jan 2008 15:20:49 -0800
+
grub (0.97-29) unstable; urgency=low
[ Otavio Salvador ]
diff -u grub-0.97/debian/control grub-0.97/debian/control
--- grub-0.97/debian/control
+++ grub-0.97/debian/control
@@ -10,7 +10,7 @@
Package: grub
Architecture: i386 kfreebsd-i386 hurd-i386 amd64 kfreebsd-amd64
-Depends: ${shlibs:Depends}
+Depends: ${shlibs:Depends}, ucf
Suggests: grub-doc, mdadm
Description: GRand Unified Bootloader
GRUB is a GPLed bootloader intended to unify bootloading across x86
only in patch2:
unchanged:
--- grub-0.97.orig/debian/grub.postinst
+++ grub-0.97/debian/grub.postinst
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+if [ "$1" = "configure" ]; then
+ if dpkg --compare-versions "$2" lt-nl "0.97-29.1"; then
+ update-grub
+ fi
+fi
+
+#DEBHELPER#