Advertisement
Guest User

kkexec

a guest
Jul 12th, 2013
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 2.55 KB | None | 0 0
  1. #!/usr/bin/env bash
  2.  
  3. # install_kernels is an array
  4. declare -a install_kernels
  5.  
  6. boot=/boot
  7. initrd=$boot/initrd.img
  8. vmlinuz=$boot/vmlinuz
  9.  
  10.  
  11. # Our current kernel
  12. current_kernel=$(uname -r)
  13.  
  14. # command line options for the kernel
  15. cmd_line=$(cat /proc/cmdline)
  16.  
  17.  
  18. # Get the installed kernels and put into an array
  19. #install_kernels=( $(dpkg -l | grep "^ii" | grep linux-image | awk '{print $2}' | sed -e 's/linux-image-//g') )
  20. install_kernels=( $(dpkg -l | grep "^ii" | grep linux-image | grep -v meta |
  21. awk '{print $2}' | sed -e 's/linux-image-//g' | grep "\." ))
  22.  
  23. is_numeric() {
  24.     echo "$@" | egrep -q -v "[^0-9]"
  25. }
  26. #is_numeric() { (exit 1) }
  27.  
  28. root_do() {
  29.     if [ "$UID" -eq 0 ] ; then
  30.         eval $@
  31.         RC=$?
  32.         [ $RC -eq 0 ] && return
  33.         echo "Failed!" #&& cd $cur ; exit $RC
  34.     fi
  35.     echo $@
  36. }
  37.  
  38.  
  39.  
  40. MAX=${#install_kernels[@]}
  41.  
  42. display_choice() {
  43.     # Display the choices
  44.     echo "Installed kernels:"
  45.     for ((i = 0; i < MAX; i++)) ; do
  46.  
  47.         msg="[$i]"
  48.         if [ "${install_kernels[$i]}" == "$current_kernel" ] ; then
  49.             msg="$msg *** "
  50.         else
  51.             msg="$msg     "
  52.         fi
  53.         echo  "$msg ${install_kernels[$i]}"
  54.     done
  55.     echo ""
  56.  
  57.     # Select a kernel to boot:
  58.     echo -n "Select a kernel to boot from: "
  59.     read choice
  60.  
  61.     if [ -n "$choice" ] ; then
  62.         is_numeric $choice
  63.         if [ $? -eq 0 ] && [ $choice -ge 0 ] && [ $choice -lt $MAX ] ; then
  64.             return
  65.         fi
  66.     fi
  67.     display_choice
  68. }
  69.  
  70.  
  71. do_kernel() {
  72.     if [ -n "${install_kernels[$choice]}" ] ; then
  73.         if [ "${install_kernels[$choice]}" == "$current_kernel" ] ; then
  74.             echo "You want to reboot the same kernel, sorry!"
  75.             exit 1
  76.         fi
  77.    
  78.         # cmd_line starts with the following line:
  79.         # BOOT_IMAGE=/boot/vmlinuz-2.6.32-trunk-686
  80.         # Let's not use it, since we are going to use a completely different kernel
  81.         cmd_line=$(echo $cmd_line | sed -e 's#BOOT_IMAGE=[^[:space:]]\+ ##')
  82.  
  83.         echo -e "\n\n"
  84.         echo "Will boot kernel: [$choice] ${install_kernels[$choice]}"
  85.  
  86.         _kkexec="kexec -l '${vmlinuz}-${install_kernels[$choice]}' --append '$cmd_line' --initrd '$initrd-${install_kernels[$choice]}'"
  87.         _kkexec_exec="kexec -e"
  88.  
  89.         root_do $_kkexec
  90.         root_do sync
  91.         root_do /etc/init.d/sendsigs stop
  92.         root_do /etc/init.d/umountfs stop
  93.         root_do /etc/init.d/umountroot stop
  94.  
  95.         root_do umount -alf
  96.         root_do $_kkexec_exec
  97.     fi
  98. }
  99.  
  100. display_choice
  101. do_kernel
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement