xref: /OK3568_Linux_fs/yocto/poky/meta/recipes-kernel/kexec/kexec-tools/kdump (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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