aboutsummaryrefslogtreecommitdiffstats
path: root/package/boot/kexec-tools/files/kdump.init
diff options
context:
space:
mode:
Diffstat (limited to 'package/boot/kexec-tools/files/kdump.init')
-rwxr-xr-xpackage/boot/kexec-tools/files/kdump.init182
1 files changed, 182 insertions, 0 deletions
diff --git a/package/boot/kexec-tools/files/kdump.init b/package/boot/kexec-tools/files/kdump.init
new file mode 100755
index 0000000000..057b8cc17a
--- /dev/null
+++ b/package/boot/kexec-tools/files/kdump.init
@@ -0,0 +1,182 @@
+#!/bin/sh /etc/rc.common
+
+START=41
+STOP=98
+
+EXTRA_COMMANDS="status"
+EXTRA_HELP=" status Print crashkernel status"
+
+verify_kdump() {
+ local cfg="$1"
+ local enabled
+ local path
+ local save_vmcore
+ local save_dmesg
+
+ config_get_bool enabled "$cfg" enabled 1
+ config_get_bool save_dmesg "$cfg" save_dmesg 1
+ config_get_bool save_vmcore "$cfg" save_vmcore 0
+
+ [ "$enabled" -gt 0 ] || return 2
+
+ [ "$save_dmesg" -gt 0 ] || [ "$save_vmcore" -gt 0 ] || return 2
+
+ config_get path "$cfg" path "/"
+
+ [ -d "$path" ] || mkdir -p "$path" 2>/dev/null || return 1
+}
+
+run_kdump() {
+ local cfg="$1"
+ local enabled
+ local path
+ local save_vmcore
+ local save_dmesg
+
+ config_get_bool enabled "$cfg" enabled 1
+ [ "$enabled" -gt 0 ] || return
+
+ config_get_bool save_dmesg "$cfg" save_dmesg 1
+ config_get_bool save_vmcore "$cfg" save_vmcore 0
+ config_get path "$cfg" path "/"
+
+ timestamp=$(date "+%Y%m%dT%H%M%S")
+
+ if [ "$save_vmcore" -eq 1 ]; then
+ # would like 'sparse' but busybox doesn't support it
+ dd if=/proc/vmcore of="$path/vmcore-$timestamp" conv=fsync bs=1M
+ fi
+
+ if [ "$save_dmesg" -eq 1 ]; then
+ vmcore-dmesg /proc/vmcore > "$path/dmesg-$timestamp"
+ fi
+
+ sync
+ reboot -f
+}
+
+find_kernel() {
+ . /lib/functions.sh
+ local kernel
+
+ kernel="$BOOT_IMAGE"
+ if [ -r "$kernel" ]; then
+ echo $kernel
+ return 0
+ fi
+
+ kernel="$(find_mtd_part kernel)"
+ if [ -r "$kernel" ]; then
+ echo $kernel
+ return 0
+ fi
+
+ for voldir in /sys/class/ubi/ubi*_*; do
+ [ ! -e "$voldir" ] && continue
+ if [ "$(cat "${voldir}/name")" = "kernel" ]; then
+ kernel="/dev/$(basename "$voldir")"
+ echo $kernel
+ return 0
+ fi
+ done
+
+ return 1
+}
+
+load_crashkernel() {
+ local append_cmdline
+ local kernel
+
+ kernel="$(find_kernel)"
+ [ $? -gt 0 ] && return 1
+
+ case "$(uname -m)" in
+ i?86|x86_64)
+ grep -q "crashkernel=" /proc/cmdline || return 1
+ append_cmdline="1 irqpoll reset_devices maxcpus=1"
+ ;;
+ arm*)
+ append_cmdline="1 maxcpus=1 reset_devices"
+ ;;
+ esac
+ kexec -p "$kernel" --reuse-cmdline --append="$append_cmdline"
+ return $?
+}
+
+start() {
+ local retval
+
+ if [ ! -e /sys/kernel/kexec_crash_loaded ]; then
+ return 1
+ fi
+
+ if [ -e /proc/vmcore ]; then
+ config_load kdump
+ config_foreach run_kdump kdump
+ else
+ config_load kdump
+ config_foreach verify_kdump kdump
+ retval=$?
+ [ $retval = 1 ] && return 1
+ [ $retval = 0 ] && load_crashkernel
+ return $?
+ fi
+}
+
+stop() {
+ [ "$(cat /sys/kernel/kexec_crash_loaded)" = "1" ] || return
+
+ if [ -e "$BOOT_IMAGE" ]; then
+ kexec -p -u "$BOOT_IMAGE"
+ fi
+}
+
+status() {
+ local retval kernel
+
+ if [ ! -e /sys/kernel/kexec_crash_loaded ]; then
+ echo "crashdump not supported by kernel"
+ return
+ fi
+
+ if [ $(cat /sys/kernel/kexec_crash_size) -eq 0 ]; then
+ echo "memory for crashdump kernel not reserved!"
+ echo "check crashkernel= kernel cmdline parameter"
+ echo "(a reboot is required after installing kdump)"
+ return
+ fi
+
+ kernel="$(find_kernel)"
+ if [ $? -gt 0 ]; then
+ echo "cannot find kernel image"
+ return
+ else
+ echo "using kernel image $kernel"
+ fi
+
+ echo -n "kdump configuration is "
+ config_load kdump
+ retval=$?
+ if [ $retval = 0 ]; then
+ if [ "$(config_foreach echo kdump)" ]; then
+ config_foreach verify_kdump kdump
+ retval=$?
+ else
+ retval=1
+ fi
+ fi
+
+ if [ $retval = 0 ]; then
+ echo "valid"
+ elif [ $retval = 2 ]; then
+ echo "disabled"
+ else
+ echo "BROKEN"
+ fi
+
+ echo -n "kexec crash kernel "
+ if [ "$(cat /sys/kernel/kexec_crash_loaded)" = "0" ]; then
+ echo -n "not "
+ fi
+ echo "loaded"
+}