| #! /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 $? |