2011-07-06 19:25:34 +00:00
|
|
|
#! /bin/sh
|
|
|
|
KEXEC=/sbin/kexec
|
|
|
|
|
|
|
|
KDUMP_KERNELVER=""
|
|
|
|
KDUMP_COMMANDLINE=""
|
|
|
|
KEXEC_ARGS=""
|
|
|
|
KDUMP_CONFIG_FILE="/etc/kdump.conf"
|
2012-06-06 08:24:23 +00:00
|
|
|
MKDUMPRD="/sbin/mkdumprd -f"
|
2012-02-22 03:16:09 +00:00
|
|
|
SAVE_PATH=/var/crash
|
|
|
|
SSH_KEY_LOCATION="/root/.ssh/kdump_id_rsa"
|
|
|
|
DUMP_TARGET=""
|
kdump: Rebuild default initrd for firmware assisted dump
The current kdump infrastructure builds a separate initrd which then
gets loaded into memory by kexec-tools for use by kdump kernel. But
firmware assisted dump (FADUMP) does not use kexec-based approach.
After crash, firmware reboots the partition and loads grub loader
like the normal booting process does. Hence in the FADUMP approach,
the second kernel (after crash) will always use the default initrd
(OS built). So, to support FADUMP, change is required, as in to add
dump capturing steps, in this initrd.
The current kdumpctl script implementation already has the code to
build initrd using mkdumprd. This patch uses the new '--rebuild'
option introduced, in dracut, to incrementally build the initramfs
image. Before rebuilding, we may need to probe the initrd image for
fadump support, to avoid rebuilding the initrd image multiple times
unnecessarily. This can be done using "lsinitrd" tool with the newly
proposed '--mod' option & inspecting the presence of "kdumpbase" in
the list of modules of default initrd image. We rebuild the image if
only "kdumpbase" module is missing in the initrd image. Also, before
rebuilding, a backup of default initrd image is taken.
Kexec-tools package in rhel7 is now enhanced to insert a out-of-tree
kdump module for dracut, which is responsible for adding vmcore
capture steps into initrd, if dracut is invoked with "IN_KDUMP"
environment variable set to 1. mkdumprd script exports "IN_KDUMP=1"
environment variable before invoking dracut to build kdump initrd.
This patch relies on this current mechanism of kdump init script.
Signed-off-by: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
Signed-off-by: Hari Bathini <hbathini@linux.vnet.ibm.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2014-07-24 18:39:07 +00:00
|
|
|
TARGET_INITRD=""
|
2014-07-24 18:38:36 +00:00
|
|
|
FADUMP_ENABLED_SYS_NODE="/sys/kernel/fadump_enabled"
|
|
|
|
FADUMP_REGISTER_SYS_NODE="/sys/kernel/fadump_registered"
|
|
|
|
#kdump shall be the default dump mode
|
|
|
|
DEFAULT_DUMP_MODE="kdump"
|
2011-07-06 19:25:34 +00:00
|
|
|
|
2013-09-26 11:46:48 +00:00
|
|
|
. /lib/kdump/kdump-lib.sh
|
|
|
|
|
2011-07-06 19:25:34 +00:00
|
|
|
standard_kexec_args="-p"
|
|
|
|
|
2015-11-18 08:00:22 +00:00
|
|
|
# Some default values in case /etc/sysconfig/kdump doesn't include
|
|
|
|
KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug"
|
|
|
|
|
2011-07-06 19:25:34 +00:00
|
|
|
if [ -f /etc/sysconfig/kdump ]; then
|
|
|
|
. /etc/sysconfig/kdump
|
|
|
|
fi
|
|
|
|
|
2013-08-30 09:21:56 +00:00
|
|
|
single_instance_lock()
|
|
|
|
{
|
2014-07-16 12:09:48 +00:00
|
|
|
local rc timeout=5
|
|
|
|
|
2013-08-30 09:21:56 +00:00
|
|
|
exec 9>/var/lock/kdump
|
2014-07-16 12:09:48 +00:00
|
|
|
|
|
|
|
flock -n 9
|
|
|
|
rc=$?
|
|
|
|
|
|
|
|
while [ $rc -ne 0 ]; do
|
|
|
|
echo "Another app is currently holding the kdump lock; waiting for it to exit..."
|
|
|
|
flock -w $timeout 9
|
|
|
|
rc=$?
|
|
|
|
done
|
2013-08-30 09:21:56 +00:00
|
|
|
}
|
|
|
|
|
2014-07-24 18:38:36 +00:00
|
|
|
determine_dump_mode()
|
|
|
|
{
|
|
|
|
# Check if firmware-assisted dump is enabled
|
|
|
|
# if yes, set the dump mode as fadump
|
|
|
|
if is_fadump_capable; then
|
|
|
|
echo "Dump mode is fadump"
|
|
|
|
DEFAULT_DUMP_MODE="fadump"
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2013-08-02 06:22:21 +00:00
|
|
|
# remove_cmdline_param <kernel cmdline> <param1> [<param2>] ... [<paramN>]
|
|
|
|
# Remove a list of kernel parameters from a given kernel cmdline and print the result.
|
|
|
|
# For each "arg" in the removing params list, "arg" and "arg=xxx" will be removed if exists.
|
2014-07-15 06:41:54 +00:00
|
|
|
remove_cmdline_param()
|
2013-08-02 06:22:21 +00:00
|
|
|
{
|
|
|
|
local cmdline=$1
|
|
|
|
shift
|
|
|
|
|
|
|
|
for arg in $@; do
|
|
|
|
cmdline=`echo $cmdline | \
|
|
|
|
sed -e "s/\b$arg=[^ ]*\b//g" \
|
|
|
|
-e "s/\b$arg\b//g" \
|
|
|
|
-e "s/\s\+/ /g"`
|
|
|
|
done
|
|
|
|
echo $cmdline
|
|
|
|
}
|
|
|
|
|
2014-02-21 01:09:30 +00:00
|
|
|
#
|
|
|
|
# This function returns the "initial apicid" of the
|
|
|
|
# boot cpu (cpu 0) if present.
|
|
|
|
#
|
2014-07-15 06:41:54 +00:00
|
|
|
get_bootcpu_initial_apicid()
|
2014-02-21 01:09:30 +00:00
|
|
|
{
|
|
|
|
awk ' \
|
|
|
|
BEGIN { CPU = "-1"; } \
|
|
|
|
$1=="processor" && $2==":" { CPU = $NF; } \
|
|
|
|
CPU=="0" && /initial apicid/ { print $NF; } \
|
|
|
|
' \
|
|
|
|
/proc/cpuinfo
|
|
|
|
}
|
|
|
|
|
|
|
|
#
|
|
|
|
# This function appends argument "$2=$3" to string ($1) if not already present.
|
|
|
|
#
|
2014-07-15 06:41:54 +00:00
|
|
|
append_cmdline()
|
2014-02-21 01:09:30 +00:00
|
|
|
{
|
2014-07-15 06:41:54 +00:00
|
|
|
local cmdline=$1
|
|
|
|
local newstr=${cmdline/$2/""}
|
2014-02-21 01:09:30 +00:00
|
|
|
|
2014-07-15 06:41:54 +00:00
|
|
|
# unchanged str implies argument wasn't there
|
|
|
|
if [ "$cmdline" == "$newstr" ]; then
|
|
|
|
cmdline="${cmdline} ${2}=${3}"
|
|
|
|
fi
|
2014-02-21 01:09:30 +00:00
|
|
|
|
2014-07-15 06:41:54 +00:00
|
|
|
echo $cmdline
|
2014-02-21 01:09:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
# This function performs a series of edits on the command line
|
2014-07-15 06:41:54 +00:00
|
|
|
prepare_cmdline()
|
2014-02-21 01:09:30 +00:00
|
|
|
{
|
|
|
|
local cmdline;
|
|
|
|
if [ -z "$KDUMP_COMMANDLINE" ]; then
|
|
|
|
cmdline=`cat /proc/cmdline`
|
|
|
|
else
|
|
|
|
cmdline=${KDUMP_COMMANDLINE}
|
|
|
|
fi
|
2015-11-18 08:00:22 +00:00
|
|
|
# These params should always be removed
|
|
|
|
cmdline=`remove_cmdline_param "$cmdline" crashkernel panic_on_warn`
|
|
|
|
# These params can be removed configurably
|
|
|
|
cmdline=`remove_cmdline_param "$cmdline" ${KDUMP_COMMANDLINE_REMOVE}`
|
2014-02-21 01:09:30 +00:00
|
|
|
|
|
|
|
cmdline="${cmdline} ${KDUMP_COMMANDLINE_APPEND}"
|
|
|
|
|
|
|
|
local id=`get_bootcpu_initial_apicid`
|
|
|
|
if [ ! -z ${id} ] ; then
|
|
|
|
cmdline=`append_cmdline "${cmdline}" disable_cpu_apicid ${id}`
|
|
|
|
fi
|
|
|
|
|
|
|
|
echo $cmdline
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2014-07-15 06:41:54 +00:00
|
|
|
save_core()
|
2011-07-06 19:25:34 +00:00
|
|
|
{
|
|
|
|
coredir="/var/crash/`date +"%Y-%m-%d-%H:%M"`"
|
|
|
|
|
|
|
|
mkdir -p $coredir
|
|
|
|
cp --sparse=always /proc/vmcore $coredir/vmcore-incomplete
|
|
|
|
if [ $? == 0 ]; then
|
|
|
|
mv $coredir/vmcore-incomplete $coredir/vmcore
|
2013-02-18 09:05:41 +00:00
|
|
|
echo "saved a vmcore to $coredir"
|
2011-07-06 19:25:34 +00:00
|
|
|
else
|
2013-02-18 09:05:41 +00:00
|
|
|
echo "failed to save a vmcore to $coredir" >&2
|
2011-07-06 19:25:34 +00:00
|
|
|
fi
|
|
|
|
|
|
|
|
# pass the dmesg to Abrt tool if exists, in order
|
|
|
|
# to collect the kernel oops message.
|
|
|
|
# https://fedorahosted.org/abrt/
|
|
|
|
if [ -x /usr/bin/dumpoops ]; then
|
|
|
|
makedumpfile --dump-dmesg $coredir/vmcore $coredir/dmesg >/dev/null 2>&1
|
|
|
|
dumpoops -d $coredir/dmesg >/dev/null 2>&1
|
|
|
|
if [ $? == 0 ]; then
|
2013-02-18 09:05:41 +00:00
|
|
|
echo "kernel oops has been collected by abrt tool"
|
2011-07-06 19:25:34 +00:00
|
|
|
fi
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
kdump: Rebuild default initrd for firmware assisted dump
The current kdump infrastructure builds a separate initrd which then
gets loaded into memory by kexec-tools for use by kdump kernel. But
firmware assisted dump (FADUMP) does not use kexec-based approach.
After crash, firmware reboots the partition and loads grub loader
like the normal booting process does. Hence in the FADUMP approach,
the second kernel (after crash) will always use the default initrd
(OS built). So, to support FADUMP, change is required, as in to add
dump capturing steps, in this initrd.
The current kdumpctl script implementation already has the code to
build initrd using mkdumprd. This patch uses the new '--rebuild'
option introduced, in dracut, to incrementally build the initramfs
image. Before rebuilding, we may need to probe the initrd image for
fadump support, to avoid rebuilding the initrd image multiple times
unnecessarily. This can be done using "lsinitrd" tool with the newly
proposed '--mod' option & inspecting the presence of "kdumpbase" in
the list of modules of default initrd image. We rebuild the image if
only "kdumpbase" module is missing in the initrd image. Also, before
rebuilding, a backup of default initrd image is taken.
Kexec-tools package in rhel7 is now enhanced to insert a out-of-tree
kdump module for dracut, which is responsible for adding vmcore
capture steps into initrd, if dracut is invoked with "IN_KDUMP"
environment variable set to 1. mkdumprd script exports "IN_KDUMP=1"
environment variable before invoking dracut to build kdump initrd.
This patch relies on this current mechanism of kdump init script.
Signed-off-by: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
Signed-off-by: Hari Bathini <hbathini@linux.vnet.ibm.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2014-07-24 18:39:07 +00:00
|
|
|
rebuild_fadump_initrd()
|
2012-06-14 01:57:27 +00:00
|
|
|
{
|
kdump: Rebuild default initrd for firmware assisted dump
The current kdump infrastructure builds a separate initrd which then
gets loaded into memory by kexec-tools for use by kdump kernel. But
firmware assisted dump (FADUMP) does not use kexec-based approach.
After crash, firmware reboots the partition and loads grub loader
like the normal booting process does. Hence in the FADUMP approach,
the second kernel (after crash) will always use the default initrd
(OS built). So, to support FADUMP, change is required, as in to add
dump capturing steps, in this initrd.
The current kdumpctl script implementation already has the code to
build initrd using mkdumprd. This patch uses the new '--rebuild'
option introduced, in dracut, to incrementally build the initramfs
image. Before rebuilding, we may need to probe the initrd image for
fadump support, to avoid rebuilding the initrd image multiple times
unnecessarily. This can be done using "lsinitrd" tool with the newly
proposed '--mod' option & inspecting the presence of "kdumpbase" in
the list of modules of default initrd image. We rebuild the image if
only "kdumpbase" module is missing in the initrd image. Also, before
rebuilding, a backup of default initrd image is taken.
Kexec-tools package in rhel7 is now enhanced to insert a out-of-tree
kdump module for dracut, which is responsible for adding vmcore
capture steps into initrd, if dracut is invoked with "IN_KDUMP"
environment variable set to 1. mkdumprd script exports "IN_KDUMP=1"
environment variable before invoking dracut to build kdump initrd.
This patch relies on this current mechanism of kdump init script.
Signed-off-by: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
Signed-off-by: Hari Bathini <hbathini@linux.vnet.ibm.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2014-07-24 18:39:07 +00:00
|
|
|
local target_initrd_tmp
|
|
|
|
|
|
|
|
# backup fadump initrd for reference before replacing it
|
|
|
|
backup_initrd
|
|
|
|
|
2014-07-24 18:39:22 +00:00
|
|
|
# this file tells the initrd is fadump enabled
|
|
|
|
touch /tmp/fadump.initramfs
|
kdump: Rebuild default initrd for firmware assisted dump
The current kdump infrastructure builds a separate initrd which then
gets loaded into memory by kexec-tools for use by kdump kernel. But
firmware assisted dump (FADUMP) does not use kexec-based approach.
After crash, firmware reboots the partition and loads grub loader
like the normal booting process does. Hence in the FADUMP approach,
the second kernel (after crash) will always use the default initrd
(OS built). So, to support FADUMP, change is required, as in to add
dump capturing steps, in this initrd.
The current kdumpctl script implementation already has the code to
build initrd using mkdumprd. This patch uses the new '--rebuild'
option introduced, in dracut, to incrementally build the initramfs
image. Before rebuilding, we may need to probe the initrd image for
fadump support, to avoid rebuilding the initrd image multiple times
unnecessarily. This can be done using "lsinitrd" tool with the newly
proposed '--mod' option & inspecting the presence of "kdumpbase" in
the list of modules of default initrd image. We rebuild the image if
only "kdumpbase" module is missing in the initrd image. Also, before
rebuilding, a backup of default initrd image is taken.
Kexec-tools package in rhel7 is now enhanced to insert a out-of-tree
kdump module for dracut, which is responsible for adding vmcore
capture steps into initrd, if dracut is invoked with "IN_KDUMP"
environment variable set to 1. mkdumprd script exports "IN_KDUMP=1"
environment variable before invoking dracut to build kdump initrd.
This patch relies on this current mechanism of kdump init script.
Signed-off-by: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
Signed-off-by: Hari Bathini <hbathini@linux.vnet.ibm.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2014-07-24 18:39:07 +00:00
|
|
|
target_initrd_tmp="$TARGET_INITRD.tmp"
|
2014-07-24 18:39:22 +00:00
|
|
|
$MKDUMPRD $target_initrd_tmp --rebuild $TARGET_INITRD --kver $kdump_kver \
|
|
|
|
-i /tmp/fadump.initramfs /etc/fadump.initramfs
|
kdump: Rebuild default initrd for firmware assisted dump
The current kdump infrastructure builds a separate initrd which then
gets loaded into memory by kexec-tools for use by kdump kernel. But
firmware assisted dump (FADUMP) does not use kexec-based approach.
After crash, firmware reboots the partition and loads grub loader
like the normal booting process does. Hence in the FADUMP approach,
the second kernel (after crash) will always use the default initrd
(OS built). So, to support FADUMP, change is required, as in to add
dump capturing steps, in this initrd.
The current kdumpctl script implementation already has the code to
build initrd using mkdumprd. This patch uses the new '--rebuild'
option introduced, in dracut, to incrementally build the initramfs
image. Before rebuilding, we may need to probe the initrd image for
fadump support, to avoid rebuilding the initrd image multiple times
unnecessarily. This can be done using "lsinitrd" tool with the newly
proposed '--mod' option & inspecting the presence of "kdumpbase" in
the list of modules of default initrd image. We rebuild the image if
only "kdumpbase" module is missing in the initrd image. Also, before
rebuilding, a backup of default initrd image is taken.
Kexec-tools package in rhel7 is now enhanced to insert a out-of-tree
kdump module for dracut, which is responsible for adding vmcore
capture steps into initrd, if dracut is invoked with "IN_KDUMP"
environment variable set to 1. mkdumprd script exports "IN_KDUMP=1"
environment variable before invoking dracut to build kdump initrd.
This patch relies on this current mechanism of kdump init script.
Signed-off-by: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
Signed-off-by: Hari Bathini <hbathini@linux.vnet.ibm.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2014-07-24 18:39:07 +00:00
|
|
|
if [ $? != 0 ]; then
|
|
|
|
echo "mkdumprd: failed to rebuild initrd with fadump support" >&2
|
2014-08-04 10:46:36 +00:00
|
|
|
rm -f /tmp/fadump.initramfs
|
kdump: Rebuild default initrd for firmware assisted dump
The current kdump infrastructure builds a separate initrd which then
gets loaded into memory by kexec-tools for use by kdump kernel. But
firmware assisted dump (FADUMP) does not use kexec-based approach.
After crash, firmware reboots the partition and loads grub loader
like the normal booting process does. Hence in the FADUMP approach,
the second kernel (after crash) will always use the default initrd
(OS built). So, to support FADUMP, change is required, as in to add
dump capturing steps, in this initrd.
The current kdumpctl script implementation already has the code to
build initrd using mkdumprd. This patch uses the new '--rebuild'
option introduced, in dracut, to incrementally build the initramfs
image. Before rebuilding, we may need to probe the initrd image for
fadump support, to avoid rebuilding the initrd image multiple times
unnecessarily. This can be done using "lsinitrd" tool with the newly
proposed '--mod' option & inspecting the presence of "kdumpbase" in
the list of modules of default initrd image. We rebuild the image if
only "kdumpbase" module is missing in the initrd image. Also, before
rebuilding, a backup of default initrd image is taken.
Kexec-tools package in rhel7 is now enhanced to insert a out-of-tree
kdump module for dracut, which is responsible for adding vmcore
capture steps into initrd, if dracut is invoked with "IN_KDUMP"
environment variable set to 1. mkdumprd script exports "IN_KDUMP=1"
environment variable before invoking dracut to build kdump initrd.
This patch relies on this current mechanism of kdump init script.
Signed-off-by: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
Signed-off-by: Hari Bathini <hbathini@linux.vnet.ibm.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2014-07-24 18:39:07 +00:00
|
|
|
return 1
|
|
|
|
fi
|
2014-08-04 10:46:36 +00:00
|
|
|
rm -f /tmp/fadump.initramfs
|
kdump: Rebuild default initrd for firmware assisted dump
The current kdump infrastructure builds a separate initrd which then
gets loaded into memory by kexec-tools for use by kdump kernel. But
firmware assisted dump (FADUMP) does not use kexec-based approach.
After crash, firmware reboots the partition and loads grub loader
like the normal booting process does. Hence in the FADUMP approach,
the second kernel (after crash) will always use the default initrd
(OS built). So, to support FADUMP, change is required, as in to add
dump capturing steps, in this initrd.
The current kdumpctl script implementation already has the code to
build initrd using mkdumprd. This patch uses the new '--rebuild'
option introduced, in dracut, to incrementally build the initramfs
image. Before rebuilding, we may need to probe the initrd image for
fadump support, to avoid rebuilding the initrd image multiple times
unnecessarily. This can be done using "lsinitrd" tool with the newly
proposed '--mod' option & inspecting the presence of "kdumpbase" in
the list of modules of default initrd image. We rebuild the image if
only "kdumpbase" module is missing in the initrd image. Also, before
rebuilding, a backup of default initrd image is taken.
Kexec-tools package in rhel7 is now enhanced to insert a out-of-tree
kdump module for dracut, which is responsible for adding vmcore
capture steps into initrd, if dracut is invoked with "IN_KDUMP"
environment variable set to 1. mkdumprd script exports "IN_KDUMP=1"
environment variable before invoking dracut to build kdump initrd.
This patch relies on this current mechanism of kdump init script.
Signed-off-by: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
Signed-off-by: Hari Bathini <hbathini@linux.vnet.ibm.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2014-07-24 18:39:07 +00:00
|
|
|
|
|
|
|
# updating fadump initrd
|
|
|
|
mv $target_initrd_tmp $TARGET_INITRD
|
|
|
|
sync
|
|
|
|
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
|
|
|
|
rebuild_kdump_initrd()
|
|
|
|
{
|
|
|
|
$MKDUMPRD $TARGET_INITRD $kdump_kver
|
2012-06-14 01:57:27 +00:00
|
|
|
if [ $? != 0 ]; then
|
2013-02-18 09:05:41 +00:00
|
|
|
echo "mkdumprd: failed to make kdump initrd" >&2
|
2012-06-14 01:57:27 +00:00
|
|
|
return 1
|
|
|
|
fi
|
kdump: Rebuild default initrd for firmware assisted dump
The current kdump infrastructure builds a separate initrd which then
gets loaded into memory by kexec-tools for use by kdump kernel. But
firmware assisted dump (FADUMP) does not use kexec-based approach.
After crash, firmware reboots the partition and loads grub loader
like the normal booting process does. Hence in the FADUMP approach,
the second kernel (after crash) will always use the default initrd
(OS built). So, to support FADUMP, change is required, as in to add
dump capturing steps, in this initrd.
The current kdumpctl script implementation already has the code to
build initrd using mkdumprd. This patch uses the new '--rebuild'
option introduced, in dracut, to incrementally build the initramfs
image. Before rebuilding, we may need to probe the initrd image for
fadump support, to avoid rebuilding the initrd image multiple times
unnecessarily. This can be done using "lsinitrd" tool with the newly
proposed '--mod' option & inspecting the presence of "kdumpbase" in
the list of modules of default initrd image. We rebuild the image if
only "kdumpbase" module is missing in the initrd image. Also, before
rebuilding, a backup of default initrd image is taken.
Kexec-tools package in rhel7 is now enhanced to insert a out-of-tree
kdump module for dracut, which is responsible for adding vmcore
capture steps into initrd, if dracut is invoked with "IN_KDUMP"
environment variable set to 1. mkdumprd script exports "IN_KDUMP=1"
environment variable before invoking dracut to build kdump initrd.
This patch relies on this current mechanism of kdump init script.
Signed-off-by: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
Signed-off-by: Hari Bathini <hbathini@linux.vnet.ibm.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2014-07-24 18:39:07 +00:00
|
|
|
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
|
|
|
|
rebuild_initrd()
|
|
|
|
{
|
|
|
|
if [ $DEFAULT_DUMP_MODE == "fadump" ]; then
|
|
|
|
rebuild_fadump_initrd
|
|
|
|
else
|
|
|
|
rebuild_kdump_initrd
|
|
|
|
fi
|
|
|
|
|
|
|
|
return $?
|
2012-06-14 01:57:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#$1: the files to be checked with IFS=' '
|
2014-07-15 06:41:54 +00:00
|
|
|
check_exist()
|
2012-06-14 01:57:27 +00:00
|
|
|
{
|
|
|
|
for file in $1; do
|
|
|
|
if [ ! -f "$file" ]; then
|
|
|
|
echo -n "Error: $file not found."; echo
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
|
|
|
#$1: the files to be checked with IFS=' '
|
2014-07-15 06:41:54 +00:00
|
|
|
check_executable()
|
2012-06-14 01:57:27 +00:00
|
|
|
{
|
|
|
|
for file in $1; do
|
|
|
|
if [ ! -x "$file" ]; then
|
|
|
|
echo -n "Error: $file is not executable."; echo
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
kdump: Rebuild default initrd for firmware assisted dump
The current kdump infrastructure builds a separate initrd which then
gets loaded into memory by kexec-tools for use by kdump kernel. But
firmware assisted dump (FADUMP) does not use kexec-based approach.
After crash, firmware reboots the partition and loads grub loader
like the normal booting process does. Hence in the FADUMP approach,
the second kernel (after crash) will always use the default initrd
(OS built). So, to support FADUMP, change is required, as in to add
dump capturing steps, in this initrd.
The current kdumpctl script implementation already has the code to
build initrd using mkdumprd. This patch uses the new '--rebuild'
option introduced, in dracut, to incrementally build the initramfs
image. Before rebuilding, we may need to probe the initrd image for
fadump support, to avoid rebuilding the initrd image multiple times
unnecessarily. This can be done using "lsinitrd" tool with the newly
proposed '--mod' option & inspecting the presence of "kdumpbase" in
the list of modules of default initrd image. We rebuild the image if
only "kdumpbase" module is missing in the initrd image. Also, before
rebuilding, a backup of default initrd image is taken.
Kexec-tools package in rhel7 is now enhanced to insert a out-of-tree
kdump module for dracut, which is responsible for adding vmcore
capture steps into initrd, if dracut is invoked with "IN_KDUMP"
environment variable set to 1. mkdumprd script exports "IN_KDUMP=1"
environment variable before invoking dracut to build kdump initrd.
This patch relies on this current mechanism of kdump init script.
Signed-off-by: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
Signed-off-by: Hari Bathini <hbathini@linux.vnet.ibm.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2014-07-24 18:39:07 +00:00
|
|
|
backup_initrd()
|
|
|
|
{
|
|
|
|
local target_initrd_bak
|
|
|
|
|
|
|
|
# Check if backup initrd is already present.
|
|
|
|
target_initrd_bak="$TARGET_INITRD.bak"
|
|
|
|
if [ ! -e $target_initrd_bak ];then
|
|
|
|
echo "Backing up $TARGET_INITRD"
|
|
|
|
cp $TARGET_INITRD $target_initrd_bak
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2014-07-15 06:41:54 +00:00
|
|
|
check_config()
|
2013-03-11 09:31:25 +00:00
|
|
|
{
|
|
|
|
local nr
|
|
|
|
|
|
|
|
nr=$(awk 'BEGIN{cnt=0} /^raw|^ssh[[:blank:]]|^nfs|^ext[234]|^xfs|^btrfs|^minix/{cnt++} END{print cnt}' $KDUMP_CONFIG_FILE)
|
|
|
|
[ $nr -gt 1 ] && {
|
|
|
|
echo "More than one dump targets specified."
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
|
|
|
|
while read config_opt config_val; do
|
2014-07-15 06:41:54 +00:00
|
|
|
# remove inline comments after the end of a directive.
|
|
|
|
config_val=$(strip_comments $config_val)
|
2013-03-11 09:31:25 +00:00
|
|
|
case "$config_opt" in
|
|
|
|
\#* | "")
|
|
|
|
;;
|
2014-04-02 08:33:47 +00:00
|
|
|
raw|ext2|ext3|ext4|minix|btrfs|xfs|nfs|ssh|sshkey|path|core_collector|kdump_post|kdump_pre|extra_bins|extra_modules|default|force_rebuild|dracut_args|fence_kdump_args|fence_kdump_nodes)
|
2013-03-11 09:31:25 +00:00
|
|
|
[ -z "$config_val" ] && {
|
|
|
|
echo "Invalid kdump config value for option $config_opt."
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
;;
|
2013-03-22 03:55:24 +00:00
|
|
|
net|options|link_delay|disk_timeout|debug_mem_level|blacklist)
|
2013-03-11 09:31:25 +00:00
|
|
|
echo "Deprecated kdump config option: $config_opt. Refer to kdump.conf manpage for alternatives."
|
|
|
|
return 1
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
echo "Invalid kdump config option $config_opt"
|
|
|
|
return 1;
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
done < $KDUMP_CONFIG_FILE
|
2014-07-15 06:41:54 +00:00
|
|
|
|
2015-06-11 08:22:11 +00:00
|
|
|
check_default_config || return 1
|
|
|
|
|
2014-04-02 08:33:47 +00:00
|
|
|
check_fence_kdump_config || return 1
|
|
|
|
|
2013-03-11 09:31:25 +00:00
|
|
|
return 0
|
|
|
|
}
|
|
|
|
|
2014-04-02 08:33:47 +00:00
|
|
|
# get_pcs_cluster_modified_files <image timestamp>
|
|
|
|
# return list of modified file for fence_kdump modified in Pacemaker cluster
|
|
|
|
get_pcs_cluster_modified_files()
|
2013-12-17 07:00:33 +00:00
|
|
|
{
|
|
|
|
local image_time=$1
|
2014-04-02 08:33:47 +00:00
|
|
|
local time_stamp
|
|
|
|
local modified_files
|
2013-12-17 07:00:33 +00:00
|
|
|
|
2014-04-02 08:33:47 +00:00
|
|
|
is_generic_fence_kdump && return 1
|
2014-04-02 08:33:43 +00:00
|
|
|
is_pcs_fence_kdump || return 1
|
2013-12-17 07:00:33 +00:00
|
|
|
|
2014-04-02 08:33:47 +00:00
|
|
|
time_stamp=`pcs cluster cib | xmllint --xpath 'string(/cib/@cib-last-written)' - | \
|
|
|
|
xargs -0 date +%s --date`
|
2013-12-17 07:00:33 +00:00
|
|
|
|
2014-04-02 08:33:47 +00:00
|
|
|
if [ -n $time_stamp -a $time_stamp -gt $image_time ]; then
|
|
|
|
modified_files="cluster-cib"
|
2013-12-17 07:00:33 +00:00
|
|
|
fi
|
|
|
|
|
2014-04-02 08:33:47 +00:00
|
|
|
if [ -f $FENCE_KDUMP_CONFIG_FILE ]; then
|
|
|
|
time_stamp=`stat -c "%Y" $FENCE_KDUMP_CONFIG_FILE`
|
|
|
|
if [ "$time_stamp" -gt "$image_time" ]; then
|
|
|
|
modified_files="$modified_files $FENCE_KDUMP_CONFIG_FILE"
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
echo $modified_files
|
2013-12-17 07:00:33 +00:00
|
|
|
}
|
|
|
|
|
2015-01-28 08:22:47 +00:00
|
|
|
check_boot_dir()
|
|
|
|
{
|
|
|
|
#If user specify a boot dir for kdump kernel, let's use it. Otherwise
|
|
|
|
#check whether it's a atomic host. If yes parse the subdirectory under
|
|
|
|
#/boot; If not just find it under /boot.
|
|
|
|
[ -n "$KDUMP_BOOTDIR" ] && return
|
|
|
|
|
2015-04-17 08:26:25 +00:00
|
|
|
if ! is_atomic || [ "$(uname -m)" = "s390x" ]; then
|
2015-01-28 08:22:47 +00:00
|
|
|
KDUMP_BOOTDIR="/boot"
|
|
|
|
else
|
|
|
|
eval $(cat /proc/cmdline| grep "BOOT_IMAGE" | cut -d' ' -f1)
|
|
|
|
KDUMP_BOOTDIR="/boot"$(dirname $BOOT_IMAGE)
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
kdump: Rebuild default initrd for firmware assisted dump
The current kdump infrastructure builds a separate initrd which then
gets loaded into memory by kexec-tools for use by kdump kernel. But
firmware assisted dump (FADUMP) does not use kexec-based approach.
After crash, firmware reboots the partition and loads grub loader
like the normal booting process does. Hence in the FADUMP approach,
the second kernel (after crash) will always use the default initrd
(OS built). So, to support FADUMP, change is required, as in to add
dump capturing steps, in this initrd.
The current kdumpctl script implementation already has the code to
build initrd using mkdumprd. This patch uses the new '--rebuild'
option introduced, in dracut, to incrementally build the initramfs
image. Before rebuilding, we may need to probe the initrd image for
fadump support, to avoid rebuilding the initrd image multiple times
unnecessarily. This can be done using "lsinitrd" tool with the newly
proposed '--mod' option & inspecting the presence of "kdumpbase" in
the list of modules of default initrd image. We rebuild the image if
only "kdumpbase" module is missing in the initrd image. Also, before
rebuilding, a backup of default initrd image is taken.
Kexec-tools package in rhel7 is now enhanced to insert a out-of-tree
kdump module for dracut, which is responsible for adding vmcore
capture steps into initrd, if dracut is invoked with "IN_KDUMP"
environment variable set to 1. mkdumprd script exports "IN_KDUMP=1"
environment variable before invoking dracut to build kdump initrd.
This patch relies on this current mechanism of kdump init script.
Signed-off-by: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
Signed-off-by: Hari Bathini <hbathini@linux.vnet.ibm.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2014-07-24 18:39:07 +00:00
|
|
|
setup_target_initrd()
|
|
|
|
{
|
|
|
|
if [ $DEFAULT_DUMP_MODE == "fadump" ]; then
|
|
|
|
TARGET_INITRD="${KDUMP_BOOTDIR}/initramfs-${kdump_kver}.img"
|
|
|
|
if [ ! -s "$TARGET_INITRD" ]; then
|
|
|
|
echo "Error: No initrd found to rebuild!"
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
else
|
|
|
|
TARGET_INITRD="${KDUMP_BOOTDIR}/initramfs-${kdump_kver}kdump.img"
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2014-07-15 06:41:54 +00:00
|
|
|
check_rebuild()
|
2011-07-06 19:25:34 +00:00
|
|
|
{
|
2012-06-14 01:57:27 +00:00
|
|
|
local extra_modules modified_files=""
|
2012-08-06 14:01:29 +00:00
|
|
|
local _force_rebuild force_rebuild="0"
|
kdump: Rebuild default initrd for firmware assisted dump
The current kdump infrastructure builds a separate initrd which then
gets loaded into memory by kexec-tools for use by kdump kernel. But
firmware assisted dump (FADUMP) does not use kexec-based approach.
After crash, firmware reboots the partition and loads grub loader
like the normal booting process does. Hence in the FADUMP approach,
the second kernel (after crash) will always use the default initrd
(OS built). So, to support FADUMP, change is required, as in to add
dump capturing steps, in this initrd.
The current kdumpctl script implementation already has the code to
build initrd using mkdumprd. This patch uses the new '--rebuild'
option introduced, in dracut, to incrementally build the initramfs
image. Before rebuilding, we may need to probe the initrd image for
fadump support, to avoid rebuilding the initrd image multiple times
unnecessarily. This can be done using "lsinitrd" tool with the newly
proposed '--mod' option & inspecting the presence of "kdumpbase" in
the list of modules of default initrd image. We rebuild the image if
only "kdumpbase" module is missing in the initrd image. Also, before
rebuilding, a backup of default initrd image is taken.
Kexec-tools package in rhel7 is now enhanced to insert a out-of-tree
kdump module for dracut, which is responsible for adding vmcore
capture steps into initrd, if dracut is invoked with "IN_KDUMP"
environment variable set to 1. mkdumprd script exports "IN_KDUMP=1"
environment variable before invoking dracut to build kdump initrd.
This patch relies on this current mechanism of kdump init script.
Signed-off-by: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
Signed-off-by: Hari Bathini <hbathini@linux.vnet.ibm.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2014-07-24 18:39:07 +00:00
|
|
|
local initramfs_has_fadump
|
2012-06-14 01:57:27 +00:00
|
|
|
|
2015-01-28 08:22:47 +00:00
|
|
|
check_boot_dir
|
|
|
|
|
2011-07-06 19:25:34 +00:00
|
|
|
if [ -z "$KDUMP_KERNELVER" ]; then
|
2011-07-25 10:04:32 +00:00
|
|
|
kdump_kver=`uname -r`
|
2011-07-06 19:25:34 +00:00
|
|
|
else
|
|
|
|
kdump_kver=$KDUMP_KERNELVER
|
|
|
|
fi
|
|
|
|
|
|
|
|
kdump_kernel="${KDUMP_BOOTDIR}/${KDUMP_IMG}-${kdump_kver}${KDUMP_IMG_EXT}"
|
kdump: Rebuild default initrd for firmware assisted dump
The current kdump infrastructure builds a separate initrd which then
gets loaded into memory by kexec-tools for use by kdump kernel. But
firmware assisted dump (FADUMP) does not use kexec-based approach.
After crash, firmware reboots the partition and loads grub loader
like the normal booting process does. Hence in the FADUMP approach,
the second kernel (after crash) will always use the default initrd
(OS built). So, to support FADUMP, change is required, as in to add
dump capturing steps, in this initrd.
The current kdumpctl script implementation already has the code to
build initrd using mkdumprd. This patch uses the new '--rebuild'
option introduced, in dracut, to incrementally build the initramfs
image. Before rebuilding, we may need to probe the initrd image for
fadump support, to avoid rebuilding the initrd image multiple times
unnecessarily. This can be done using "lsinitrd" tool with the newly
proposed '--mod' option & inspecting the presence of "kdumpbase" in
the list of modules of default initrd image. We rebuild the image if
only "kdumpbase" module is missing in the initrd image. Also, before
rebuilding, a backup of default initrd image is taken.
Kexec-tools package in rhel7 is now enhanced to insert a out-of-tree
kdump module for dracut, which is responsible for adding vmcore
capture steps into initrd, if dracut is invoked with "IN_KDUMP"
environment variable set to 1. mkdumprd script exports "IN_KDUMP=1"
environment variable before invoking dracut to build kdump initrd.
This patch relies on this current mechanism of kdump init script.
Signed-off-by: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
Signed-off-by: Hari Bathini <hbathini@linux.vnet.ibm.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2014-07-24 18:39:07 +00:00
|
|
|
setup_target_initrd
|
|
|
|
if [ $? -ne 0 ]; then
|
|
|
|
return 1
|
|
|
|
fi
|
2011-07-06 19:25:34 +00:00
|
|
|
|
2012-08-06 14:01:29 +00:00
|
|
|
_force_rebuild=`grep ^force_rebuild $KDUMP_CONFIG_FILE 2>/dev/null`
|
|
|
|
if [ $? -eq 0 ]; then
|
|
|
|
force_rebuild=`echo $_force_rebuild | cut -d' ' -f2`
|
|
|
|
if [ "$force_rebuild" != "0" ] && [ "$force_rebuild" != "1" ];then
|
|
|
|
echo "Error: force_rebuild value is invalid"
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
2012-06-14 01:57:27 +00:00
|
|
|
#will rebuild every time if extra_modules are specified
|
|
|
|
extra_modules=`grep ^extra_modules $KDUMP_CONFIG_FILE`
|
2012-08-06 14:01:29 +00:00
|
|
|
[ -n "$extra_modules" ] && force_rebuild="1"
|
2011-07-06 19:25:34 +00:00
|
|
|
|
2012-06-14 01:57:27 +00:00
|
|
|
#check to see if dependent files has been modified
|
|
|
|
#since last build of the image file
|
kdump: Rebuild default initrd for firmware assisted dump
The current kdump infrastructure builds a separate initrd which then
gets loaded into memory by kexec-tools for use by kdump kernel. But
firmware assisted dump (FADUMP) does not use kexec-based approach.
After crash, firmware reboots the partition and loads grub loader
like the normal booting process does. Hence in the FADUMP approach,
the second kernel (after crash) will always use the default initrd
(OS built). So, to support FADUMP, change is required, as in to add
dump capturing steps, in this initrd.
The current kdumpctl script implementation already has the code to
build initrd using mkdumprd. This patch uses the new '--rebuild'
option introduced, in dracut, to incrementally build the initramfs
image. Before rebuilding, we may need to probe the initrd image for
fadump support, to avoid rebuilding the initrd image multiple times
unnecessarily. This can be done using "lsinitrd" tool with the newly
proposed '--mod' option & inspecting the presence of "kdumpbase" in
the list of modules of default initrd image. We rebuild the image if
only "kdumpbase" module is missing in the initrd image. Also, before
rebuilding, a backup of default initrd image is taken.
Kexec-tools package in rhel7 is now enhanced to insert a out-of-tree
kdump module for dracut, which is responsible for adding vmcore
capture steps into initrd, if dracut is invoked with "IN_KDUMP"
environment variable set to 1. mkdumprd script exports "IN_KDUMP=1"
environment variable before invoking dracut to build kdump initrd.
This patch relies on this current mechanism of kdump init script.
Signed-off-by: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
Signed-off-by: Hari Bathini <hbathini@linux.vnet.ibm.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2014-07-24 18:39:07 +00:00
|
|
|
if [ -f $TARGET_INITRD ]; then
|
|
|
|
image_time=`stat -c "%Y" $TARGET_INITRD 2>/dev/null`
|
2012-06-14 01:57:27 +00:00
|
|
|
else
|
|
|
|
image_time=0
|
2011-07-06 19:25:34 +00:00
|
|
|
fi
|
|
|
|
|
2014-04-02 08:33:45 +00:00
|
|
|
#also rebuild when Pacemaker cluster conf is changed and fence kdump is enabled.
|
2014-04-02 08:33:47 +00:00
|
|
|
modified_files=$(get_pcs_cluster_modified_files $image_time)
|
2013-12-17 07:00:33 +00:00
|
|
|
|
2012-06-14 01:57:30 +00:00
|
|
|
EXTRA_BINS=`grep ^kdump_post $KDUMP_CONFIG_FILE | cut -d\ -f2`
|
|
|
|
CHECK_FILES=`grep ^kdump_pre $KDUMP_CONFIG_FILE | cut -d\ -f2`
|
|
|
|
EXTRA_BINS="$EXTRA_BINS $CHECK_FILES"
|
|
|
|
CHECK_FILES=`grep ^extra_bins $KDUMP_CONFIG_FILE | cut -d\ -f2-`
|
|
|
|
EXTRA_BINS="$EXTRA_BINS $CHECK_FILES"
|
2014-12-23 20:13:24 +00:00
|
|
|
files="$KDUMP_CONFIG_FILE $kdump_kernel $EXTRA_BINS /etc/fstab"
|
2012-06-14 01:57:27 +00:00
|
|
|
|
|
|
|
check_exist "$files" && check_executable "$EXTRA_BINS"
|
|
|
|
[ $? -ne 0 ] && return 1
|
|
|
|
|
|
|
|
for file in $files; do
|
|
|
|
time_stamp=`stat -c "%Y" $file`
|
|
|
|
if [ "$time_stamp" -gt "$image_time" ]; then
|
|
|
|
modified_files="$modified_files $file"
|
2011-07-06 19:25:34 +00:00
|
|
|
fi
|
2012-06-14 01:57:27 +00:00
|
|
|
done
|
|
|
|
|
kdump: Rebuild default initrd for firmware assisted dump
The current kdump infrastructure builds a separate initrd which then
gets loaded into memory by kexec-tools for use by kdump kernel. But
firmware assisted dump (FADUMP) does not use kexec-based approach.
After crash, firmware reboots the partition and loads grub loader
like the normal booting process does. Hence in the FADUMP approach,
the second kernel (after crash) will always use the default initrd
(OS built). So, to support FADUMP, change is required, as in to add
dump capturing steps, in this initrd.
The current kdumpctl script implementation already has the code to
build initrd using mkdumprd. This patch uses the new '--rebuild'
option introduced, in dracut, to incrementally build the initramfs
image. Before rebuilding, we may need to probe the initrd image for
fadump support, to avoid rebuilding the initrd image multiple times
unnecessarily. This can be done using "lsinitrd" tool with the newly
proposed '--mod' option & inspecting the presence of "kdumpbase" in
the list of modules of default initrd image. We rebuild the image if
only "kdumpbase" module is missing in the initrd image. Also, before
rebuilding, a backup of default initrd image is taken.
Kexec-tools package in rhel7 is now enhanced to insert a out-of-tree
kdump module for dracut, which is responsible for adding vmcore
capture steps into initrd, if dracut is invoked with "IN_KDUMP"
environment variable set to 1. mkdumprd script exports "IN_KDUMP=1"
environment variable before invoking dracut to build kdump initrd.
This patch relies on this current mechanism of kdump init script.
Signed-off-by: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
Signed-off-by: Hari Bathini <hbathini@linux.vnet.ibm.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2014-07-24 18:39:07 +00:00
|
|
|
#check if target initrd has fadump support
|
2014-08-05 05:51:16 +00:00
|
|
|
if [ "$DEFAULT_DUMP_MODE" = "fadump" ] && [ -f "$TARGET_INITRD" ]; then
|
|
|
|
initramfs_has_fadump=`lsinitrd -m $TARGET_INITRD | grep ^kdumpbase$ | wc -l`
|
|
|
|
fi
|
kdump: Rebuild default initrd for firmware assisted dump
The current kdump infrastructure builds a separate initrd which then
gets loaded into memory by kexec-tools for use by kdump kernel. But
firmware assisted dump (FADUMP) does not use kexec-based approach.
After crash, firmware reboots the partition and loads grub loader
like the normal booting process does. Hence in the FADUMP approach,
the second kernel (after crash) will always use the default initrd
(OS built). So, to support FADUMP, change is required, as in to add
dump capturing steps, in this initrd.
The current kdumpctl script implementation already has the code to
build initrd using mkdumprd. This patch uses the new '--rebuild'
option introduced, in dracut, to incrementally build the initramfs
image. Before rebuilding, we may need to probe the initrd image for
fadump support, to avoid rebuilding the initrd image multiple times
unnecessarily. This can be done using "lsinitrd" tool with the newly
proposed '--mod' option & inspecting the presence of "kdumpbase" in
the list of modules of default initrd image. We rebuild the image if
only "kdumpbase" module is missing in the initrd image. Also, before
rebuilding, a backup of default initrd image is taken.
Kexec-tools package in rhel7 is now enhanced to insert a out-of-tree
kdump module for dracut, which is responsible for adding vmcore
capture steps into initrd, if dracut is invoked with "IN_KDUMP"
environment variable set to 1. mkdumprd script exports "IN_KDUMP=1"
environment variable before invoking dracut to build kdump initrd.
This patch relies on this current mechanism of kdump init script.
Signed-off-by: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
Signed-off-by: Hari Bathini <hbathini@linux.vnet.ibm.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2014-07-24 18:39:07 +00:00
|
|
|
|
2012-06-14 01:57:27 +00:00
|
|
|
if [ $image_time -eq 0 ]; then
|
|
|
|
echo -n "No kdump initial ramdisk found."; echo
|
kdump: Rebuild default initrd for firmware assisted dump
The current kdump infrastructure builds a separate initrd which then
gets loaded into memory by kexec-tools for use by kdump kernel. But
firmware assisted dump (FADUMP) does not use kexec-based approach.
After crash, firmware reboots the partition and loads grub loader
like the normal booting process does. Hence in the FADUMP approach,
the second kernel (after crash) will always use the default initrd
(OS built). So, to support FADUMP, change is required, as in to add
dump capturing steps, in this initrd.
The current kdumpctl script implementation already has the code to
build initrd using mkdumprd. This patch uses the new '--rebuild'
option introduced, in dracut, to incrementally build the initramfs
image. Before rebuilding, we may need to probe the initrd image for
fadump support, to avoid rebuilding the initrd image multiple times
unnecessarily. This can be done using "lsinitrd" tool with the newly
proposed '--mod' option & inspecting the presence of "kdumpbase" in
the list of modules of default initrd image. We rebuild the image if
only "kdumpbase" module is missing in the initrd image. Also, before
rebuilding, a backup of default initrd image is taken.
Kexec-tools package in rhel7 is now enhanced to insert a out-of-tree
kdump module for dracut, which is responsible for adding vmcore
capture steps into initrd, if dracut is invoked with "IN_KDUMP"
environment variable set to 1. mkdumprd script exports "IN_KDUMP=1"
environment variable before invoking dracut to build kdump initrd.
This patch relies on this current mechanism of kdump init script.
Signed-off-by: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
Signed-off-by: Hari Bathini <hbathini@linux.vnet.ibm.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2014-07-24 18:39:07 +00:00
|
|
|
elif [ $DEFAULT_DUMP_MODE == "fadump" ] && [ "$initramfs_has_fadump" -eq "0" ]; then
|
|
|
|
echo "$TARGET_INITRD has no fadump support"
|
2012-08-06 14:01:29 +00:00
|
|
|
elif [ "$force_rebuild" != "0" ]; then
|
kdump: Rebuild default initrd for firmware assisted dump
The current kdump infrastructure builds a separate initrd which then
gets loaded into memory by kexec-tools for use by kdump kernel. But
firmware assisted dump (FADUMP) does not use kexec-based approach.
After crash, firmware reboots the partition and loads grub loader
like the normal booting process does. Hence in the FADUMP approach,
the second kernel (after crash) will always use the default initrd
(OS built). So, to support FADUMP, change is required, as in to add
dump capturing steps, in this initrd.
The current kdumpctl script implementation already has the code to
build initrd using mkdumprd. This patch uses the new '--rebuild'
option introduced, in dracut, to incrementally build the initramfs
image. Before rebuilding, we may need to probe the initrd image for
fadump support, to avoid rebuilding the initrd image multiple times
unnecessarily. This can be done using "lsinitrd" tool with the newly
proposed '--mod' option & inspecting the presence of "kdumpbase" in
the list of modules of default initrd image. We rebuild the image if
only "kdumpbase" module is missing in the initrd image. Also, before
rebuilding, a backup of default initrd image is taken.
Kexec-tools package in rhel7 is now enhanced to insert a out-of-tree
kdump module for dracut, which is responsible for adding vmcore
capture steps into initrd, if dracut is invoked with "IN_KDUMP"
environment variable set to 1. mkdumprd script exports "IN_KDUMP=1"
environment variable before invoking dracut to build kdump initrd.
This patch relies on this current mechanism of kdump init script.
Signed-off-by: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
Signed-off-by: Hari Bathini <hbathini@linux.vnet.ibm.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2014-07-24 18:39:07 +00:00
|
|
|
echo -n "Force rebuild $TARGET_INITRD"; echo
|
2012-06-14 01:57:27 +00:00
|
|
|
elif [ -n "$modified_files" ]; then
|
2014-07-15 06:41:54 +00:00
|
|
|
echo "Detected change(s) in the following file(s):"
|
2012-06-14 01:57:27 +00:00
|
|
|
echo -n " "; echo "$modified_files" | sed 's/\s/\n /g'
|
|
|
|
else
|
|
|
|
return 0
|
2011-07-06 19:25:34 +00:00
|
|
|
fi
|
|
|
|
|
kdump: Rebuild default initrd for firmware assisted dump
The current kdump infrastructure builds a separate initrd which then
gets loaded into memory by kexec-tools for use by kdump kernel. But
firmware assisted dump (FADUMP) does not use kexec-based approach.
After crash, firmware reboots the partition and loads grub loader
like the normal booting process does. Hence in the FADUMP approach,
the second kernel (after crash) will always use the default initrd
(OS built). So, to support FADUMP, change is required, as in to add
dump capturing steps, in this initrd.
The current kdumpctl script implementation already has the code to
build initrd using mkdumprd. This patch uses the new '--rebuild'
option introduced, in dracut, to incrementally build the initramfs
image. Before rebuilding, we may need to probe the initrd image for
fadump support, to avoid rebuilding the initrd image multiple times
unnecessarily. This can be done using "lsinitrd" tool with the newly
proposed '--mod' option & inspecting the presence of "kdumpbase" in
the list of modules of default initrd image. We rebuild the image if
only "kdumpbase" module is missing in the initrd image. Also, before
rebuilding, a backup of default initrd image is taken.
Kexec-tools package in rhel7 is now enhanced to insert a out-of-tree
kdump module for dracut, which is responsible for adding vmcore
capture steps into initrd, if dracut is invoked with "IN_KDUMP"
environment variable set to 1. mkdumprd script exports "IN_KDUMP=1"
environment variable before invoking dracut to build kdump initrd.
This patch relies on this current mechanism of kdump init script.
Signed-off-by: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
Signed-off-by: Hari Bathini <hbathini@linux.vnet.ibm.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2014-07-24 18:39:07 +00:00
|
|
|
echo "Rebuilding $TARGET_INITRD"
|
2012-06-14 01:57:27 +00:00
|
|
|
rebuild_initrd
|
|
|
|
return $?
|
2011-07-06 19:25:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
# This function check iomem and determines if we have more than
|
|
|
|
# 4GB of ram available. Returns 1 if we do, 0 if we dont
|
2014-07-15 06:41:54 +00:00
|
|
|
need_64bit_headers()
|
2011-07-06 19:25:34 +00:00
|
|
|
{
|
2014-07-15 06:41:54 +00:00
|
|
|
return `tail -n 1 /proc/iomem | awk '{ split ($1, r, "-"); \
|
|
|
|
print (strtonum("0x" r[2]) > strtonum("0xffffffff")); }'`
|
2011-07-06 19:25:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
# Load the kdump kerel specified in /etc/sysconfig/kdump
|
|
|
|
# If none is specified, try to load a kdump kernel with the same version
|
|
|
|
# as the currently running kernel.
|
2014-07-15 06:41:54 +00:00
|
|
|
load_kdump()
|
2011-07-06 19:25:34 +00:00
|
|
|
{
|
2012-11-12 08:51:03 +00:00
|
|
|
MEM_RESERVED=$(cat /sys/kernel/kexec_crash_size)
|
|
|
|
if [ $MEM_RESERVED -eq 0 ]
|
2011-07-06 19:25:34 +00:00
|
|
|
then
|
2013-02-18 09:05:41 +00:00
|
|
|
echo "No memory reserved for crash kernel." >&2
|
2011-07-06 19:25:34 +00:00
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
|
2012-11-12 08:51:03 +00:00
|
|
|
ARCH=`uname -m`
|
2011-07-06 19:25:34 +00:00
|
|
|
if [ "$ARCH" == "i686" -o "$ARCH" == "i386" ]
|
|
|
|
then
|
|
|
|
|
|
|
|
need_64bit_headers
|
|
|
|
if [ $? == 1 ]
|
|
|
|
then
|
|
|
|
FOUND_ELF_ARGS=`echo $KEXEC_ARGS | grep elf32-core-headers`
|
|
|
|
if [ -n "$FOUND_ELF_ARGS" ]
|
|
|
|
then
|
|
|
|
echo -n "Warning: elf32-core-headers overrides correct elf64 setting"
|
|
|
|
echo
|
|
|
|
else
|
|
|
|
KEXEC_ARGS="$KEXEC_ARGS --elf64-core-headers"
|
|
|
|
fi
|
|
|
|
else
|
|
|
|
FOUND_ELF_ARGS=`echo $KEXEC_ARGS | grep elf64-core-headers`
|
|
|
|
if [ -z "$FOUND_ELF_ARGS" ]
|
|
|
|
then
|
|
|
|
KEXEC_ARGS="$KEXEC_ARGS --elf32-core-headers"
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
2014-02-21 01:09:30 +00:00
|
|
|
KDUMP_COMMANDLINE=`prepare_cmdline`
|
2011-07-06 19:25:34 +00:00
|
|
|
|
2014-09-08 15:35:22 +00:00
|
|
|
# For secureboot enabled machines, use new kexec file based syscall.
|
|
|
|
# Old syscall will always fail as it does not have capability to
|
|
|
|
# to kernel signature verification.
|
|
|
|
if is_secure_boot_enforced; then
|
|
|
|
echo "Secure Boot is enabled. Using kexec file based syscall."
|
|
|
|
KEXEC_ARGS="$KEXEC_ARGS -s"
|
|
|
|
fi
|
|
|
|
|
2011-07-06 19:25:34 +00:00
|
|
|
$KEXEC $KEXEC_ARGS $standard_kexec_args \
|
|
|
|
--command-line="$KDUMP_COMMANDLINE" \
|
2014-09-08 15:35:20 +00:00
|
|
|
--initrd=$TARGET_INITRD $kdump_kernel
|
2011-07-06 19:25:34 +00:00
|
|
|
if [ $? == 0 ]; then
|
2013-02-18 09:05:41 +00:00
|
|
|
echo "kexec: loaded kdump kernel"
|
2011-07-06 19:25:34 +00:00
|
|
|
return 0
|
|
|
|
else
|
2013-02-18 09:05:41 +00:00
|
|
|
echo "kexec: failed to load kdump kernel" >&2
|
2011-07-06 19:25:34 +00:00
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2014-07-15 06:41:54 +00:00
|
|
|
check_ssh_config()
|
2012-02-22 03:16:09 +00:00
|
|
|
{
|
|
|
|
while read config_opt config_val; do
|
2014-07-15 06:41:54 +00:00
|
|
|
# remove inline comments after the end of a directive.
|
|
|
|
config_val=$(strip_comments $config_val)
|
2012-02-22 03:16:09 +00:00
|
|
|
case "$config_opt" in
|
|
|
|
sshkey)
|
|
|
|
if [ -f "$config_val" ]; then
|
|
|
|
# canonicalize the path
|
|
|
|
SSH_KEY_LOCATION=$(/usr/bin/readlink -m $config_val)
|
|
|
|
else
|
|
|
|
echo "WARNING: '$config_val' doesn't exist, using default value '$SSH_KEY_LOCATION'"
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
path)
|
|
|
|
SAVE_PATH=$config_val
|
|
|
|
;;
|
2012-07-23 07:31:28 +00:00
|
|
|
ssh)
|
2012-02-22 03:16:09 +00:00
|
|
|
DUMP_TARGET=$config_val
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
done < $KDUMP_CONFIG_FILE
|
|
|
|
|
|
|
|
#make sure they've configured kdump.conf for ssh dumps
|
2012-03-28 08:23:38 +00:00
|
|
|
local SSH_TARGET=`echo -n $DUMP_TARGET | sed -n '/.*@/p'`
|
2012-02-22 03:16:09 +00:00
|
|
|
if [ -z "$SSH_TARGET" ]; then
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
|
2014-07-15 06:41:54 +00:00
|
|
|
check_ssh_target()
|
2012-02-22 03:16:09 +00:00
|
|
|
{
|
2013-02-18 09:05:43 +00:00
|
|
|
local _ret
|
|
|
|
ssh -q -i $SSH_KEY_LOCATION -o BatchMode=yes $DUMP_TARGET mkdir -p $SAVE_PATH
|
|
|
|
_ret=$?
|
|
|
|
if [ $_ret -ne 0 ]; then
|
|
|
|
echo "Could not create $DUMP_TARGET:$SAVE_PATH, you probably need to run \"kdumpctl propagate\"" >&2
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
return 0
|
2012-02-22 03:16:09 +00:00
|
|
|
}
|
|
|
|
|
2014-07-15 06:41:54 +00:00
|
|
|
propagate_ssh_key()
|
2011-07-06 19:25:34 +00:00
|
|
|
{
|
2012-02-22 03:16:09 +00:00
|
|
|
check_ssh_config
|
|
|
|
if [ $? -ne 0 ]; then
|
2013-02-18 09:05:41 +00:00
|
|
|
echo "No ssh config specified in $KDUMP_CONFIG_FILE. Can't propagate" >&2
|
2012-02-22 03:16:09 +00:00
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
local KEYFILE=$SSH_KEY_LOCATION
|
2011-07-06 19:25:34 +00:00
|
|
|
local errmsg="Failed to propagate ssh key"
|
|
|
|
|
|
|
|
#Check to see if we already created key, if not, create it.
|
|
|
|
if [ -f $KEYFILE ]; then
|
|
|
|
echo "Using existing keys..."
|
|
|
|
else
|
|
|
|
echo -n "Generating new ssh keys... "
|
2012-02-22 03:16:09 +00:00
|
|
|
/usr/bin/ssh-keygen -t rsa -f $KEYFILE -N "" 2>&1 > /dev/null
|
2011-07-06 19:25:34 +00:00
|
|
|
echo "done."
|
|
|
|
fi
|
|
|
|
|
|
|
|
#now find the target ssh user and server to contact.
|
2012-02-22 03:16:09 +00:00
|
|
|
SSH_USER=`echo $DUMP_TARGET | cut -d\ -f2 | cut -d@ -f1`
|
|
|
|
SSH_SERVER=`echo $DUMP_TARGET | sed -e's/\(.*@\)\(.*$\)/\2/'`
|
2014-07-15 06:41:54 +00:00
|
|
|
|
2011-07-06 19:25:34 +00:00
|
|
|
#now send the found key to the found server
|
2012-02-22 03:16:09 +00:00
|
|
|
ssh-copy-id -i $KEYFILE $SSH_USER@$SSH_SERVER
|
2011-07-06 19:25:34 +00:00
|
|
|
RET=$?
|
|
|
|
if [ $RET == 0 ]; then
|
|
|
|
echo $KEYFILE has been added to ~$SSH_USER/.ssh/authorized_keys on $SSH_SERVER
|
|
|
|
return 0
|
|
|
|
else
|
2013-02-18 09:05:41 +00:00
|
|
|
echo $errmsg, $KEYFILE failed in transfer to $SSH_SERVER >&2
|
2011-07-06 19:25:34 +00:00
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2014-07-24 18:38:36 +00:00
|
|
|
is_fadump_capable()
|
|
|
|
{
|
|
|
|
# Check if firmware-assisted dump is enabled
|
|
|
|
# if no, fallback to kdump check
|
|
|
|
if [ -f $FADUMP_ENABLED_SYS_NODE ]; then
|
|
|
|
rc=`cat $FADUMP_ENABLED_SYS_NODE`
|
|
|
|
[ $rc -eq 1 ] && return 0
|
|
|
|
fi
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
|
|
|
|
check_current_fadump_status()
|
|
|
|
{
|
|
|
|
# Check if firmware-assisted dump has been registered.
|
|
|
|
rc=`cat $FADUMP_REGISTER_SYS_NODE`
|
|
|
|
[ $rc -eq 1 ] && return 0
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
|
2014-07-15 06:41:54 +00:00
|
|
|
check_current_kdump_status()
|
2011-07-06 19:25:34 +00:00
|
|
|
{
|
|
|
|
rc=`cat /sys/kernel/kexec_crash_loaded`
|
|
|
|
if [ $rc == 1 ]; then
|
|
|
|
return 0
|
|
|
|
else
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2014-07-24 18:38:36 +00:00
|
|
|
check_current_status()
|
|
|
|
{
|
|
|
|
if [ $DEFAULT_DUMP_MODE == "fadump" ]; then
|
|
|
|
check_current_fadump_status
|
|
|
|
else
|
|
|
|
check_current_kdump_status
|
|
|
|
fi
|
|
|
|
|
|
|
|
return $?
|
|
|
|
}
|
|
|
|
|
2014-07-15 06:41:54 +00:00
|
|
|
save_raw()
|
2012-04-28 10:01:18 +00:00
|
|
|
{
|
|
|
|
local kdump_dir
|
|
|
|
local raw_target
|
|
|
|
|
|
|
|
raw_target=$(awk '$1 ~ /^raw$/ { print $2; }' $KDUMP_CONFIG_FILE)
|
|
|
|
[ -z "$raw_target" ] && return 0
|
|
|
|
[ -b "$raw_target" ] || {
|
|
|
|
echo "raw partition $raw_target not found"
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
kdump_dir=`grep ^path $KDUMP_CONFIG_FILE | cut -d' ' -f2-`
|
|
|
|
if [ -z "${kdump_dir}" ]; then
|
|
|
|
coredir="/var/crash/`date +"%Y-%m-%d-%H:%M"`"
|
|
|
|
else
|
|
|
|
coredir="${kdump_dir}/`date +"%Y-%m-%d-%H:%M"`"
|
|
|
|
fi
|
|
|
|
|
|
|
|
mkdir -p "$coredir"
|
|
|
|
[ -d "$coredir" ] || {
|
|
|
|
echo "failed to create $coredir"
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
if makedumpfile -R $coredir/vmcore <$raw_target >/dev/null 2>&1; then
|
|
|
|
# dump found
|
|
|
|
echo "Dump saved to $coredir/vmcore"
|
|
|
|
# wipe makedumpfile header
|
|
|
|
dd if=/dev/zero of=$raw_target bs=1b count=1 2>/dev/null
|
|
|
|
else
|
|
|
|
rm -rf "$coredir"
|
|
|
|
fi
|
|
|
|
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
|
2014-07-15 06:41:54 +00:00
|
|
|
get_save_path()
|
|
|
|
{
|
2013-06-08 06:22:31 +00:00
|
|
|
local _save_path=$(grep "^path" /etc/kdump.conf|awk '{print $2}')
|
|
|
|
if [ -z "$_save_path" ]; then
|
|
|
|
_save_path="/var/crash"
|
|
|
|
fi
|
|
|
|
|
|
|
|
echo $_save_path
|
|
|
|
}
|
|
|
|
|
2014-07-15 06:41:54 +00:00
|
|
|
is_dump_target_configured()
|
|
|
|
{
|
|
|
|
local _target
|
2013-06-08 06:22:31 +00:00
|
|
|
|
2014-07-15 06:41:54 +00:00
|
|
|
_target=$(egrep "^ext[234]|^xfs|^btrfs|^minix|^raw|^ssh|^nfs" /etc/kdump.conf)
|
2013-06-08 06:22:31 +00:00
|
|
|
|
2014-07-15 06:41:54 +00:00
|
|
|
[ -n "$_target" ]
|
2013-06-08 06:22:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
local_fs_dump_target()
|
|
|
|
{
|
|
|
|
local _target
|
|
|
|
|
|
|
|
_target=$(egrep "^ext[234]|^xfs|^btrfs|^minix" /etc/kdump.conf)
|
|
|
|
if [ $? -eq 0 ]; then
|
|
|
|
echo $_target|awk '{print $2}'
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2014-07-15 06:41:54 +00:00
|
|
|
path_to_be_relabeled()
|
|
|
|
{
|
2013-06-08 06:22:31 +00:00
|
|
|
local _path _target _mnt="/" _rmnt
|
|
|
|
|
|
|
|
if is_dump_target_configured; then
|
|
|
|
_target=$(local_fs_dump_target)
|
|
|
|
if [[ -n "$_target" ]]; then
|
|
|
|
_mnt=$(findmnt -k -f -n -r -o TARGET $_target)
|
|
|
|
if [ -z "$_mnt" ]; then
|
|
|
|
return
|
|
|
|
fi
|
|
|
|
else
|
|
|
|
return
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
_path=$(get_save_path)
|
|
|
|
# if $_path is masked by other mount, we will not relabel it.
|
|
|
|
_rmnt=$(df $_mnt/$_path 2>/dev/null | tail -1 | awk '{ print $NF }')
|
|
|
|
if [ "$_rmnt" == "$_mnt" ]; then
|
|
|
|
echo $_mnt/$_path
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
selinux_relabel()
|
|
|
|
{
|
|
|
|
local _path _i _attr
|
|
|
|
|
|
|
|
_path=$(path_to_be_relabeled)
|
|
|
|
if [ -z "$_path" ] || ! [ -d "$_path" ] ; then
|
|
|
|
return
|
|
|
|
fi
|
|
|
|
|
|
|
|
for _i in $(find $_path); do
|
|
|
|
_attr=$(getfattr -m "security.selinux" $_i 2>/dev/null)
|
|
|
|
if [ -z "$_attr" ]; then
|
|
|
|
restorecon $_i;
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
2014-02-12 02:31:41 +00:00
|
|
|
# Check if secure boot is being enforced.
|
|
|
|
#
|
|
|
|
# Per Peter Jones, we need check efivar SecureBoot-$(the UUID) and
|
|
|
|
# SetupMode-$(the UUID), they are both 5 bytes binary data. The first four
|
|
|
|
# bytes are the attributes associated with the variable and can safely be
|
|
|
|
# ignored, the last bytes are one-byte true-or-false variables. If SecureBoot
|
|
|
|
# is 1 and SetupMode is 0, then secure boot is being enforced.
|
|
|
|
#
|
|
|
|
# Assume efivars is mounted at /sys/firmware/efi/efivars.
|
2014-07-15 06:41:54 +00:00
|
|
|
is_secure_boot_enforced()
|
2014-02-12 02:31:41 +00:00
|
|
|
{
|
|
|
|
local secure_boot_file setup_mode_file
|
|
|
|
local secure_boot_byte setup_mode_byte
|
|
|
|
|
|
|
|
secure_boot_file=$(find /sys/firmware/efi/efivars -name SecureBoot-* 2>/dev/null)
|
|
|
|
setup_mode_file=$(find /sys/firmware/efi/efivars -name SetupMode-* 2>/dev/null)
|
|
|
|
|
|
|
|
if [ -f "$secure_boot_file" ] && [ -f "$setup_mode_file" ]; then
|
|
|
|
secure_boot_byte=$(hexdump -v -e '/1 "%d\ "' $secure_boot_file|cut -d' ' -f 5)
|
|
|
|
setup_mode_byte=$(hexdump -v -e '/1 "%d\ "' $setup_mode_file|cut -d' ' -f 5)
|
|
|
|
|
|
|
|
if [ "$secure_boot_byte" = "1" ] && [ "$setup_mode_byte" = "0" ]; then
|
|
|
|
return 0
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
|
2014-07-15 06:41:54 +00:00
|
|
|
check_kdump_feasibility()
|
2014-02-12 02:31:41 +00:00
|
|
|
{
|
2014-02-13 03:23:58 +00:00
|
|
|
if [ ! -e /sys/kernel/kexec_crash_loaded ]; then
|
|
|
|
echo "Kdump is not supported on this kernel"
|
|
|
|
return 1
|
|
|
|
fi
|
2014-02-12 02:31:41 +00:00
|
|
|
}
|
|
|
|
|
2014-07-15 06:41:54 +00:00
|
|
|
check_fence_kdump_config()
|
2014-04-02 08:33:47 +00:00
|
|
|
{
|
|
|
|
local hostname=`hostname`
|
|
|
|
local nodes=$(get_option_value "fence_kdump_nodes")
|
|
|
|
|
|
|
|
for node in $nodes; do
|
|
|
|
if [ "$node" = "$hostname" ]; then
|
|
|
|
echo "Option fence_kdump_nodes cannot contain $hostname"
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
|
2014-07-24 18:38:36 +00:00
|
|
|
check_dump_feasibility()
|
|
|
|
{
|
|
|
|
if [ $DEFAULT_DUMP_MODE == "fadump" ]; then
|
|
|
|
return 0
|
|
|
|
fi
|
|
|
|
|
|
|
|
check_kdump_feasibility
|
|
|
|
return $?
|
|
|
|
}
|
|
|
|
|
2014-07-24 18:38:53 +00:00
|
|
|
start_fadump()
|
|
|
|
{
|
|
|
|
echo 1 > $FADUMP_REGISTER_SYS_NODE
|
|
|
|
if ! check_current_fadump_status; then
|
|
|
|
echo "fadump: failed to register"
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
echo "fadump: registered successfully"
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
|
|
|
|
start_dump()
|
|
|
|
{
|
|
|
|
if [ $DEFAULT_DUMP_MODE == "fadump" ]; then
|
|
|
|
start_fadump
|
|
|
|
else
|
|
|
|
load_kdump
|
|
|
|
fi
|
|
|
|
|
|
|
|
return $?
|
|
|
|
}
|
|
|
|
|
2015-06-11 08:22:11 +00:00
|
|
|
check_default_config()
|
|
|
|
{
|
|
|
|
local default_option
|
|
|
|
|
|
|
|
default_option=$(awk '$1 ~ /^default$/ {print $2;}' $KDUMP_CONFIG_FILE)
|
|
|
|
if [ -z "$default_option" ]; then
|
|
|
|
return 0
|
|
|
|
else
|
|
|
|
case "$default_option" in
|
|
|
|
reboot|halt|poweroff|shell|dump_to_rootfs)
|
|
|
|
return 0
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
echo $"Usage kdump.conf: default {reboot|halt|poweroff|shell|dump_to_rootfs}"
|
|
|
|
return 1
|
|
|
|
esac
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2014-07-15 06:41:54 +00:00
|
|
|
start()
|
2011-07-06 19:25:34 +00:00
|
|
|
{
|
2013-03-11 09:31:25 +00:00
|
|
|
check_config
|
|
|
|
if [ $? -ne 0 ]; then
|
|
|
|
echo "Starting kdump: [FAILED]"
|
2012-04-28 07:17:13 +00:00
|
|
|
return 1
|
2013-03-11 09:31:25 +00:00
|
|
|
fi
|
2012-04-28 07:17:13 +00:00
|
|
|
|
2013-06-08 06:22:31 +00:00
|
|
|
if sestatus 2>/dev/null | grep -q "SELinux status.*enabled"; then
|
|
|
|
selinux_relabel
|
|
|
|
fi
|
2012-04-28 10:01:18 +00:00
|
|
|
save_raw
|
|
|
|
if [ $? -ne 0 ]; then
|
2013-02-18 09:05:42 +00:00
|
|
|
echo "Starting kdump: [FAILED]"
|
2012-04-28 10:01:18 +00:00
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
|
2014-07-24 18:38:36 +00:00
|
|
|
check_dump_feasibility
|
2014-02-12 02:31:41 +00:00
|
|
|
if [ $? -ne 0 ]; then
|
|
|
|
echo "Starting kdump: [FAILED]"
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
|
2014-07-24 18:38:36 +00:00
|
|
|
check_current_status
|
2014-02-13 03:23:58 +00:00
|
|
|
if [ $? == 0 ]; then
|
|
|
|
echo "Kdump already running: [WARNING]"
|
|
|
|
return 0
|
2011-07-06 19:25:34 +00:00
|
|
|
fi
|
2012-02-22 03:16:09 +00:00
|
|
|
|
2013-02-18 09:05:43 +00:00
|
|
|
if check_ssh_config; then
|
|
|
|
if ! check_ssh_target; then
|
|
|
|
echo "Starting kdump: [FAILED]"
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
2013-03-05 08:07:37 +00:00
|
|
|
check_rebuild
|
2011-07-06 19:25:34 +00:00
|
|
|
if [ $? != 0 ]; then
|
2013-02-18 09:05:42 +00:00
|
|
|
echo "Starting kdump: [FAILED]"
|
2011-07-06 19:25:34 +00:00
|
|
|
return 1
|
|
|
|
fi
|
2014-07-24 18:38:53 +00:00
|
|
|
|
|
|
|
start_dump
|
2011-07-06 19:25:34 +00:00
|
|
|
if [ $? != 0 ]; then
|
2013-02-18 09:05:42 +00:00
|
|
|
echo "Starting kdump: [FAILED]"
|
2011-07-06 19:25:34 +00:00
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
|
2013-02-18 09:05:42 +00:00
|
|
|
echo "Starting kdump: [OK]"
|
2011-07-06 19:25:34 +00:00
|
|
|
}
|
|
|
|
|
2014-07-24 18:39:00 +00:00
|
|
|
stop_fadump()
|
|
|
|
{
|
|
|
|
echo 0 > $FADUMP_REGISTER_SYS_NODE
|
|
|
|
if check_current_fadump_status; then
|
|
|
|
echo "fadump: failed to unregister"
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
echo "fadump: unregistered successfully"
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
|
|
|
|
stop_kdump()
|
2011-07-06 19:25:34 +00:00
|
|
|
{
|
2014-09-08 15:35:21 +00:00
|
|
|
if is_secure_boot_enforced; then
|
|
|
|
$KEXEC -s -p -u
|
|
|
|
else
|
|
|
|
$KEXEC -p -u
|
|
|
|
fi
|
|
|
|
|
2014-07-24 18:39:00 +00:00
|
|
|
if [ $? != 0 ]; then
|
2014-07-15 06:41:54 +00:00
|
|
|
echo "kexec: failed to unload kdump kernel"
|
2014-07-24 18:39:00 +00:00
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
echo "kexec: unloaded kdump kernel"
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
|
|
|
|
stop()
|
|
|
|
{
|
|
|
|
if [ $DEFAULT_DUMP_MODE == "fadump" ]; then
|
|
|
|
stop_fadump
|
|
|
|
else
|
|
|
|
stop_kdump
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [ $? != 0 ]; then
|
2013-02-18 09:05:42 +00:00
|
|
|
echo "Stopping kdump: [FAILED]"
|
2011-07-06 19:25:34 +00:00
|
|
|
return 1
|
|
|
|
fi
|
2014-07-24 18:39:00 +00:00
|
|
|
|
|
|
|
echo "Stopping kdump: [OK]"
|
|
|
|
return 0
|
2011-07-06 19:25:34 +00:00
|
|
|
}
|
|
|
|
|
2012-04-28 10:01:18 +00:00
|
|
|
if [ ! -f "$KDUMP_CONFIG_FILE" ]; then
|
2013-02-18 09:05:42 +00:00
|
|
|
echo "Error: No kdump config file found!" >&2
|
2012-04-28 10:01:18 +00:00
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
2013-11-25 16:23:11 +00:00
|
|
|
main ()
|
|
|
|
{
|
2014-07-24 18:38:36 +00:00
|
|
|
# Determine if the dump mode is kdump or fadump
|
|
|
|
determine_dump_mode
|
|
|
|
|
2013-11-25 16:23:11 +00:00
|
|
|
case "$1" in
|
|
|
|
start)
|
|
|
|
if [ -s /proc/vmcore ]; then
|
|
|
|
save_core
|
|
|
|
reboot
|
|
|
|
else
|
|
|
|
start
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
stop)
|
|
|
|
stop
|
|
|
|
;;
|
|
|
|
status)
|
2011-07-06 19:25:34 +00:00
|
|
|
EXIT_CODE=0
|
2014-07-24 18:38:36 +00:00
|
|
|
check_current_status
|
2013-11-25 16:23:11 +00:00
|
|
|
case "$?" in
|
|
|
|
0)
|
|
|
|
echo "Kdump is operational"
|
|
|
|
EXIT_CODE=0
|
|
|
|
;;
|
|
|
|
1)
|
|
|
|
echo "Kdump is not operational"
|
|
|
|
EXIT_CODE=3
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
exit $EXIT_CODE
|
2011-07-06 19:25:34 +00:00
|
|
|
;;
|
2013-11-25 16:23:11 +00:00
|
|
|
restart)
|
|
|
|
stop
|
|
|
|
start
|
|
|
|
;;
|
|
|
|
condrestart)
|
2011-07-06 19:25:34 +00:00
|
|
|
;;
|
2013-11-25 16:23:11 +00:00
|
|
|
propagate)
|
|
|
|
propagate_ssh_key
|
2011-07-06 19:25:34 +00:00
|
|
|
;;
|
2013-11-25 16:23:11 +00:00
|
|
|
*)
|
|
|
|
echo $"Usage: $0 {start|stop|status|restart|propagate}"
|
|
|
|
exit 1
|
2011-07-06 19:25:34 +00:00
|
|
|
esac
|
2013-11-25 16:23:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
# Other kdumpctl instances will block in queue, until this one exits
|
|
|
|
single_instance_lock
|
|
|
|
|
|
|
|
# To avoid fd 9 leaking, we invoke a subshell, close fd 9 and call main.
|
|
|
|
# So that fd isn't leaking when main is invoking a subshell.
|
|
|
|
(exec 9<&-; main $1)
|
2011-07-06 19:25:34 +00:00
|
|
|
|
|
|
|
exit $?
|