PDA

View Full Version : Quick reboot using kexec - The right way



onemyndseye
04-17-2007, 11:48 AM
Heres a simple script for using kexec to do a quick reboot. The script properly kills all running processes, unmounts all local filesystem, remounts root read-only and then loads the current running kernel ( /boot/vmlinuz-$(uname -r) ) and executes it with kexec -e

If it is supplied with the "-i" command line option it also includes the matching initrd



#!/bin/bash

######## Settings ########
KERNEL=/boot/vmlinuz-$(uname -r)


# Edit this to the format of your initrd filenames
INITRD="/boot/initrd.img"


# Set env and do some sanity checks
CMDLINE=$(cat /proc/cmdline)
KEXEC_STATUS=$(dpkg --get-selections kexec-tools | awk '{ print $2 }')
[ "$1" = "-i" ] && INITRD="--initrd=$INITRD-$(uname -r)" || INITRD=""
[ "$UID" != "0" ] && echo "This script must be run as root!" && exit 1
[ ! "$KEXEC_STATUS" = "install" ] && echo "kexec not found! Please install the package 'kexec-tools'" && exit 1




# Function to blank the screen... cosmedic
screen_dump() {
# Edit CYCLES if you like. Less cycles means the script will be faster
# but may leave garbage on the screen from the previous kernel
CYCLES=1000
PASS=0
clear
while [[ $PASS -lt $CYCLES ]]
do
echo "" >/dev/console ; echo "" >/dev/tty0
echo "" >/dev/tty1 ; echo "" >/dev/tty2
echo "" >/dev/tty3 ; echo "" >/dev/tty4
echo "" >/dev/tty5 ; echo "" >/dev/tty6
PASS=$(($PASS + 1))
done
clear
}

FATAL_ERROR() {
echo ""
echo "FATAL: $1 not found."
exit 1
}

# Deactivate current system and go read-only
## Make sure no other kernel has been loaded
kexec -u
sync
echo -n "Killing all running processes ..."
[ -x /etc/init.d/sendsigs ] && /etc/init.d/sendsigs stop >/dev/null 2>&1 || FATAL_ERROR "/etc/init.d/umountroot"
echo "Done"
echo -n "Mounting root read-only ..."
[ -x /etc/init.d/umountfs ] && /etc/init.d/umountfs stop >/dev/null 2>&1 || FATAL_ERROR "/etc/init.d/umountroot"
[ -x /etc/init.d/umountroot ] && /etc/init.d/umountroot stop >/dev/null 2>&1 || FATAL_ERROR "/etc/init.d/umountroot"
echo "Done"


# Clear the screen once again and boot the new kernel
# Load the system
kexec -l $KERNEL $INITRD --append="$CMDLINE"
echo "Booting the system...."
screen_dump
kexec -e



Since a partial shutdown is done... and root is remounted read-only. fsck doesnt complain :)

Enjoy!
-Justin
One Mynds Eye