1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
|
#! /bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
NOKEXECFILE=/no-kexec-reboot
. /lib/lsb/init-functions
test -r /etc/default/kexec && . /etc/default/kexec
if [ -d /etc/default/kexec.d ] ; then
for snippet in $(run-parts --list /etc/default/kexec.d) ; do
. "$snippet"
done
fi
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 | tail -1)
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 '^[[:space:]]*menuentry[[:space:]]' | 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)
}
load_kernel () {
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`"
echo "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
echo "kexec kernel loaded"
}
load_kernel
exit 0
|