blob: 3fb133fb35158cb6ac569a97008fb3616eb862ad [file] [log] [blame]
#! /bin/sh
#
# kdump
#
# Description: The kdump script provides the support:
# 1. Load a kdump kernel image into memory;
# 2. Copy away vmcore when system panic.
#
#default
KDUMP_KVER="`uname -r`"
KDUMP_KIMAGE="/boot/bzImage-${KDUMP_KVER}"
KDUMP_CMDLINE="`cat /proc/cmdline`"
KDUMP_CMDLINE_APPEND="kdump_needed maxcpus=1 irqpoll reset_devices"
KDUMP_VMCORE_PATH="/var/crash/`date +"%Y-%m-%d"`"
#get right kernel image
march="`uname -m`"
case ${march} in
x86*|i?86)
;;
*)
KDUMP_KIMAGE="/boot/uImage-${KDUMP_KVER}"
;;
esac
KEXEC=usr/sbin/kexec
KEXEC_ARGS="-p"
MAKEDUMPFILE=/usr/bin/makedumpfile
MAKEDUMPFILE_ARGS="-E -d 1"
LOGGER="logger -p info -t kdump"
if [ -f /etc/sysconfig/kdump.conf ]; then
. /etc/sysconfig/kdump.conf
fi
do_check()
{
#check makedumpfile
if [ ! -e ${MAKEDUMPFILE} -o ! -x ${MAKEDUMPFILE} ] ;then
echo "No makedumpfile found."
return 1;
fi
#check kexec
if [ ! -e ${KEXEC} -o ! -x ${KEXEC} ] ;then
echo "No kexec found."
return 1;
fi
#check whether kdump kernel image exists on the system
if [ ! -f ${KDUMP_KIMAGE} ]; then
echo "No kdump kernel image found."
return 1
fi
}
do_save_vmcore()
{
mkdir -p ${KDUMP_VMCORE_PATH}
echo "Saving a vmcore to ${KDUMP_VMCORE_PATH}."
${MAKEDUMPFILE} ${MAKEDUMPFILE_ARGS} /proc/vmcore ${KDUMP_VMCORE_PATH}/vmcore-"`date +"%H:%M:%S"`"
# cp --sparse=always /proc/vmcore ${KDUMP_VMCORE_PATH}/vmcore-"`date +"%H:%M:%S"`"
rc=$?
if [ ${rc} == 0 ]; then
${LOGGER} "Saved a vmcore to ${KDUMP_VMCORE_PATH}."
else
${LOGGER} "Failed to save vmcore!"
fi
return ${rc}
}
do_start()
{
#check file
do_check
#check whether the running kernel supports kdump.
if [ ! -e /sys/kernel/kexec_crash_loaded ]; then
echo "Kdump isn't supported on the running kernel!!!"
${LOGGER} "Kdump isn't supported on the running kernel!!!"
return 1
fi
#check whether kdump kernel image has been loaded
rc=`cat /sys/kernel/kexec_crash_loaded`
if [ ${rc} != 0 ]; then
echo "Kdump is already running.";
${LOGGER} "Kdump is already running."
return 0
fi
#check the running kernel cmdline option,insure "crashkenrel=" always set.
grep -q crashkernel= /proc/cmdline
if [ $? != 0 ]; then
echo "Kdump isn't supported on the running kernel,please check boot option!!!"
${LOGGER} "Kdump isn't supported on the running kernel,please check boot option!!!"
return 1
fi
#handle kdump cmdline parameters, remove some useless options
kcmdline=""
for x in `cat /proc/cmdline`; do
case $x in
crashkernel*)
;;
*)
kcmdline="${kcmdline} $x"
;;
esac
done
KDUMP_CMDLINE="${kcmdline} ${KDUMP_CMDLINE_APPEND}"
#Load the kdump kernel image
${KEXEC} ${KEXEC_ARGS} "${KDUMP_KIMAGE}" --append="${KDUMP_CMDLINE}"
if [ $? != 0 ]; then
echo "Failed to load kdump kernel!"
${LOGGER} "Failed to load kdump kernel!"
return 1
fi
echo "Kdump started up."
${LOGGER} "Kdump started up."
}
do_stop()
{
${KEXEC} -p -u 2>/dev/null
if [ $? == 0 ]; then
echo "Kdump has been stopped."
${LOGGER} "Kdump has been stopped."
else
echo "Failed to stop kdump!"
${LOGGER} "Failed to stop kdump!"
fi
}
case "$1" in
start)
if [ -s /proc/vmcore ]; then
do_save_vmcore
reboot
else
do_start
fi
;;
restart)
do_stop
do_start
;;
stop)
do_stop
;;
*)
echo $"Usage: $0 {start|stop|restart}"
exit 1
esac
exit $?