summaryrefslogtreecommitdiff
path: root/package/kexec-tools/files/kreboot
diff options
context:
space:
mode:
Diffstat (limited to 'package/kexec-tools/files/kreboot')
-rwxr-xr-xpackage/kexec-tools/files/kreboot49
1 files changed, 49 insertions, 0 deletions
diff --git a/package/kexec-tools/files/kreboot b/package/kexec-tools/files/kreboot
new file mode 100755
index 000000000..9b22ffeea
--- /dev/null
+++ b/package/kexec-tools/files/kreboot
@@ -0,0 +1,49 @@
+#!/bin/sh
+
+KERNEL="/mnt/boot/kernel"
+KEXEC_ARG=" -l --atags "
+PART_A=2
+PART_B=3
+
+load_kernel(){
+ # get the Bootargs and replace the current Partition with
+ # the one in $1 e.g. replace /dev/mmcblk0p2 with /dev/mmcblk0p3
+ BOOT_ARGS="$(cat /proc/cmdline | sed s#$CURRENT_PART#$1#g)"
+ # echo "kexec $KEXEC_ARG --append=\"$BOOT_ARGS\" $KERNEL"
+ # set -x
+ # Load the new kernel, unmount the partition and exec the new kernel
+ kexec -l --atags --append=\""$BOOT_ARGS"\" $KERNEL
+ umount /mnt
+ kexec -e
+}
+
+# just to be sure
+umount /mnt 2> /dev/null
+
+# get the partiton of the current kernel
+PART="/dev/$(readlink /dev/root)"
+# extract the partition number
+C_M_PART_NUM=$(readlink /dev/root | grep -o -e '[[:digit:]]*$')
+#$(readlink /dev/root | grep -o '.$')
+
+#Cut off the Partition Number
+C_M_PART=$(readlink /dev/root | sed "s/$C_M_PART_NUM\$//")
+
+CURRENT_PART="/dev/${C_M_PART}${C_M_PART_NUM}"
+
+case $C_M_PART_NUM in
+ "$PART_A")
+ DEVICE="/dev/${C_M_PART}${PART_B}"
+ mount -r $DEVICE /mnt
+ load_kernel $DEVICE
+ ;;
+ "$PART_B")
+ DEVICE="/dev/${C_M_PART}${PART_A}"
+ mount -r $DEVICE /mnt
+ load_kernel $DEVICE
+ ;;
+ *)
+ echo "FAILURE"
+ ;;
+esac
+