Package: kexec-tools
Version: 1:2.0.3-2
Severity: wishlist

I'm using Grub2's saved_entry feature:
  /etc/default/grub:
    GRUB_SAVEDEFAULT=true
    GRUB_DEFAULT=saved
which saves the selection from grub into /boot/grub/grubenv (1st
setting) and uses that setting on the next boot (2nd line). This is
especially useful when multiple kernels (or variants using the Xen
hypervisor) are installed in parallel.

Currently kexec-load from the kexec-tools don't handle this and fail to
load the "default" kernel.

I've locally patched my /etc/init.d/kexec-load to support this:
--- /tmp/x/etc/init.d/kexec-load        2013-01-12 23:04:53.000000000 +0100
+++ /etc/init.d/kexec-load      2013-01-16 22:50:55.969207479 +0100
@@ -39,6 +39,9 @@
        data=$(cat /boot/grub/grub.cfg)
 
        default=$(echo "$data" | awk '/^set default/ {print $2}' | cut -d'"' 
-f2)
+       if [ "$default" = '${saved_entry}' ]; then
+               default=$(sed -ne 's/^saved_entry=//p' /boot/grub/grubenv)
+       fi
        if [ -z "$default" ]; then
                default=0
        fi

It would be nice if that could be included with Debian and/or upstream.

-- System Information:
Debian Release: 7.0
  APT prefers unstable
  APT policy: (990, 'unstable'), (1, 'experimental')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 3.7.4 (SMP w/2 CPU cores; PREEMPT)
Locale: LANG=de_DE.UTF-8, LC_CTYPE=de_DE.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages kexec-tools depends on:
ii  debconf [debconf-2.0]  1.5.49
ii  libc6                  2.13-38

kexec-tools recommends no packages.

kexec-tools suggests no packages.

-- Configuration Files:
/etc/init.d/kexec-load changed:
PATH=/sbin:/bin:/usr/sbin:/usr/bin
NOKEXECFILE=/tmp/no-kexec-reboot
test -r /etc/default/kexec && . /etc/default/kexec
process_grub_entry() {
        initrd_image=
        while read command args; do
                if [ "$command" = "linux" ]; then
                        echo "$args" | while read kernel append; do
                        echo KERNEL_IMAGE=\"${prefix}${kernel}\"
                        echo APPEND=\"${append}\"
                        done
                elif [ "$command" = "initrd" ]; then
                        initrd_image=${prefix}${args}
                fi
        done
        echo INITRD=\"$initrd_image\"
}
get_grub_kernel() {
        test -f /boot/grub/grub.cfg || return
        local prefix
        mountpoint -q /boot && prefix=/boot || prefix=
        data=$(cat /boot/grub/grub.cfg)
        default=$(echo "$data" | awk '/^set default/ {print $2}' | cut -d'"' 
-f2)
        if [ "$default" = '${saved_entry}' ]; then
                default=$(sed -ne 's/^saved_entry=//p' /boot/grub/grubenv)
        fi
        if [ -z "$default" ]; then
                default=0
        fi
        start_offset=$((default + 1))
        end_offset=$((default + 2))
        # grub entries start with "menuentry" commands.  Get the line 
        # numbers that surround the first entry
        offsets=$(echo "$data" | grep -n ^menuentry | cut -d: -f1)
        begin=$(echo "$offsets" | tail -n+$start_offset | head -n1)
        end=$(echo "$offsets" | tail -n+$end_offset | head -n1)
        # If this is the last entry, we need to read to the end of the file
        # or to the end of boot entry section
        if [ -z "$end" ]; then
                numlines=$(echo "$data" | tail --lines=+$begin | grep -n "^### 
END" | head -1 | cut -d: -f1)
                end=$((begin + numlines - 1))
        fi
        length=$((end - begin))
        entry=$(echo "$data" | tail -n+$begin | head -n$length)
        eval $(echo "$entry" | process_grub_entry)
}
do_stop () {
        test "$LOAD_KEXEC" = "true" || exit 0
        test -x /sbin/kexec || exit 0
        test "x`cat /sys/kernel/kexec_loaded`y" = "x1y" && exit 0
        if [ -f $NOKEXECFILE ]
        then
                /bin/rm -f $NOKEXECFILE
                exit 0
        fi
        test "$USE_GRUB_CONFIG" = "true" && get_grub_kernel
        REAL_APPEND="$APPEND"
        test -z "$REAL_APPEND" && REAL_APPEND="`cat /proc/cmdline`"
        log_action_begin_msg "Loading new kernel image into memory"
        if [ -z "$INITRD" ]
        then
                /sbin/kexec -l "$KERNEL_IMAGE" --append="$REAL_APPEND"
        else
                /sbin/kexec -l "$KERNEL_IMAGE" --initrd="$INITRD" 
--append="$REAL_APPEND"
        fi
        log_action_end_msg $?
}
case "$1" in
  start)
        # No-op
        ;;
  restart|reload|force-reload)
        echo "Error: argument '$1' not supported" >&2
        exit 3
        ;;
  stop)
        do_stop
        ;;
  *)
        echo "Usage: $0 start|stop" >&2
        exit 3
        ;;
esac
exit 0


-- debconf information:
* kexec-tools/use_grub_config: true
* kexec-tools/load_kexec: true


-- 
To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to