1*4882a593Smuzhiyun#! /bin/sh 2*4882a593Smuzhiyun# 3*4882a593Smuzhiyun# kdump 4*4882a593Smuzhiyun# 5*4882a593Smuzhiyun# Description: The kdump script provides the support: 6*4882a593Smuzhiyun# 1. Load a kdump kernel image into memory; 7*4882a593Smuzhiyun# 2. Copy away vmcore when system panic. 8*4882a593Smuzhiyun# 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun#default 11*4882a593SmuzhiyunKEXEC=/usr/sbin/kexec 12*4882a593SmuzhiyunKEXEC_ARGS="-p" 13*4882a593Smuzhiyun 14*4882a593SmuzhiyunMAKEDUMPFILE=/usr/bin/makedumpfile 15*4882a593SmuzhiyunMAKEDUMPFILE_ARGS="-E -d 1" 16*4882a593Smuzhiyun 17*4882a593SmuzhiyunLOGGER="logger -p info -t kdump" 18*4882a593Smuzhiyun 19*4882a593Smuzhiyunif [ -f /etc/sysconfig/kdump.conf ]; then 20*4882a593Smuzhiyun . /etc/sysconfig/kdump.conf 21*4882a593Smuzhiyunelse 22*4882a593Smuzhiyun echo "no /etc/sysconfig/kdump.conf" 23*4882a593Smuzhiyun exit 1; 24*4882a593Smuzhiyunfi 25*4882a593Smuzhiyun 26*4882a593Smuzhiyundo_check() 27*4882a593Smuzhiyun{ 28*4882a593Smuzhiyun #check makedumpfile 29*4882a593Smuzhiyun if [ ! -e ${MAKEDUMPFILE} -o ! -x ${MAKEDUMPFILE} ] ;then 30*4882a593Smuzhiyun echo "No makedumpfile found." 31*4882a593Smuzhiyun exit 0 32*4882a593Smuzhiyun fi 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun #check kexec 35*4882a593Smuzhiyun if [ ! -e ${KEXEC} -o ! -x ${KEXEC} ] ;then 36*4882a593Smuzhiyun echo "No kexec found." 37*4882a593Smuzhiyun exit 0 38*4882a593Smuzhiyun fi 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun #check whether kdump kernel image exists on the system 41*4882a593Smuzhiyun if [ -z "${KDUMP_KIMAGE}" -o ! -f "${KDUMP_KIMAGE}" ]; then 42*4882a593Smuzhiyun echo "No kdump kernel image found." 43*4882a593Smuzhiyun exit 0 44*4882a593Smuzhiyun fi 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun if [ "${KDUMP_CMDLINE}"x = "x" ] ; then 47*4882a593Smuzhiyun echo "KDUMP_CMDLINE is not configured" 48*4882a593Smuzhiyun exit 0 49*4882a593Smuzhiyun fi 50*4882a593Smuzhiyun} 51*4882a593Smuzhiyun 52*4882a593Smuzhiyundo_save_vmcore() 53*4882a593Smuzhiyun{ 54*4882a593Smuzhiyun if [ ${KDUMP_VMCORE_PATH}x = x ]; then 55*4882a593Smuzhiyun KDUMP_VMCORE_PATH="/var/crash/`date +"%Y-%m-%d"`" 56*4882a593Smuzhiyun fi 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun mkdir -p ${KDUMP_VMCORE_PATH} 59*4882a593Smuzhiyun echo "Saving a vmcore to ${KDUMP_VMCORE_PATH}." 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun ${MAKEDUMPFILE} ${MAKEDUMPFILE_ARGS} /proc/vmcore ${KDUMP_VMCORE_PATH}/vmcore-"`date +"%H:%M:%S"`" 62*4882a593Smuzhiyun# cp --sparse=always /proc/vmcore ${KDUMP_VMCORE_PATH}/vmcore-"`date +"%H:%M:%S"`" 63*4882a593Smuzhiyun rc=$? 64*4882a593Smuzhiyun if [ ${rc} == 0 ]; then 65*4882a593Smuzhiyun ${LOGGER} "Saved a vmcore to ${KDUMP_VMCORE_PATH}." 66*4882a593Smuzhiyun else 67*4882a593Smuzhiyun ${LOGGER} "Failed to save vmcore!" 68*4882a593Smuzhiyun fi 69*4882a593Smuzhiyun return ${rc} 70*4882a593Smuzhiyun} 71*4882a593Smuzhiyun 72*4882a593Smuzhiyundo_start() 73*4882a593Smuzhiyun{ 74*4882a593Smuzhiyun #check file 75*4882a593Smuzhiyun do_check 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun #check whether the running kernel supports kdump. 78*4882a593Smuzhiyun if [ ! -e /sys/kernel/kexec_crash_loaded ]; then 79*4882a593Smuzhiyun echo "Kdump isn't supported on the running kernel!!!" 80*4882a593Smuzhiyun ${LOGGER} "Kdump isn't supported on the running kernel!!!" 81*4882a593Smuzhiyun return 1 82*4882a593Smuzhiyun fi 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun #check whether kdump kernel image has been loaded 85*4882a593Smuzhiyun rc=`cat /sys/kernel/kexec_crash_loaded` 86*4882a593Smuzhiyun if [ ${rc} != 0 ]; then 87*4882a593Smuzhiyun echo "Kdump is already running."; 88*4882a593Smuzhiyun ${LOGGER} "Kdump is already running." 89*4882a593Smuzhiyun return 0 90*4882a593Smuzhiyun fi 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun #check the running kernel cmdline option,insure "crashkernel=" always set. 93*4882a593Smuzhiyun grep -q crashkernel= /proc/cmdline 94*4882a593Smuzhiyun if [ $? != 0 ]; then 95*4882a593Smuzhiyun echo "Kdump isn't supported on the running kernel,please check boot option!!!" 96*4882a593Smuzhiyun ${LOGGER} "Kdump isn't supported on the running kernel,please check boot option!!!" 97*4882a593Smuzhiyun return 1 98*4882a593Smuzhiyun fi 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun #Load the kdump kernel image 101*4882a593Smuzhiyun ${KEXEC} ${KEXEC_ARGS} "${KDUMP_KIMAGE}" --append="${KDUMP_CMDLINE}" 102*4882a593Smuzhiyun if [ $? != 0 ]; then 103*4882a593Smuzhiyun echo "Failed to load kdump kernel!" 104*4882a593Smuzhiyun ${LOGGER} "Failed to load kdump kernel!" 105*4882a593Smuzhiyun return 1 106*4882a593Smuzhiyun fi 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun echo "Kdump started up." 109*4882a593Smuzhiyun ${LOGGER} "Kdump started up." 110*4882a593Smuzhiyun} 111*4882a593Smuzhiyun 112*4882a593Smuzhiyundo_stop() 113*4882a593Smuzhiyun{ 114*4882a593Smuzhiyun ${KEXEC} -p -u 2>/dev/null 115*4882a593Smuzhiyun if [ $? == 0 ]; then 116*4882a593Smuzhiyun echo "Kdump has been stopped." 117*4882a593Smuzhiyun ${LOGGER} "Kdump has been stopped." 118*4882a593Smuzhiyun else 119*4882a593Smuzhiyun echo "Failed to stop kdump!" 120*4882a593Smuzhiyun ${LOGGER} "Failed to stop kdump!" 121*4882a593Smuzhiyun fi 122*4882a593Smuzhiyun} 123*4882a593Smuzhiyun 124*4882a593Smuzhiyuncase "$1" in 125*4882a593Smuzhiyun start) 126*4882a593Smuzhiyun if [ -s /proc/vmcore ]; then 127*4882a593Smuzhiyun do_save_vmcore 128*4882a593Smuzhiyun reboot 129*4882a593Smuzhiyun else 130*4882a593Smuzhiyun do_start 131*4882a593Smuzhiyun fi 132*4882a593Smuzhiyun ;; 133*4882a593Smuzhiyun restart) 134*4882a593Smuzhiyun do_stop 135*4882a593Smuzhiyun do_start 136*4882a593Smuzhiyun ;; 137*4882a593Smuzhiyun stop) 138*4882a593Smuzhiyun do_stop 139*4882a593Smuzhiyun ;; 140*4882a593Smuzhiyun *) 141*4882a593Smuzhiyun echo $"Usage: $0 {start|stop|restart}" 142*4882a593Smuzhiyun exit 1 143*4882a593Smuzhiyunesac 144*4882a593Smuzhiyun 145*4882a593Smuzhiyunexit $? 146