#!/bin/sh ARCH=$(uname -m) KERNEL="/mnt/boot/kernel" KEXEC_ARGS="-l" if [ $ARCH = "arm" ]; then KEXEC_ARGS="$KEXEC_ARGS --atags" fi PART_A=2 PART_B=3 me=$0 usage() { cat >&2 <<EOF Syntax: $me [-k kernel] -k give the path to the kernel eg. /boot/vmlinuz-4.7.4 (default: $KERNEL) EOF exit $1 } while getopts "k:" ch; do case $ch { (k) # if default does not fit, give the actual keren via -k otion eg "-k /boot/vmlinuz-4.7.4 KERNEL="$OPTARG" ;; (*) usage 1 ;; } done shift $((OPTIND - 1)) 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 $KEXEC_ARGS --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:]]*$') # 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