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