2011-07-28 14:50:43 +00:00
|
|
|
#!/bin/sh
|
|
|
|
|
2014-07-24 18:39:22 +00:00
|
|
|
# continue here only if we have to save dump.
|
|
|
|
if [ -f /etc/fadump.initramfs ] && [ ! -f /proc/device-tree/rtas/ibm,kernel-dump ]; then
|
2014-10-23 06:24:39 +00:00
|
|
|
exit 0
|
2014-07-24 18:39:22 +00:00
|
|
|
fi
|
|
|
|
|
2013-07-05 07:45:07 +00:00
|
|
|
exec &> /dev/console
|
2011-07-28 14:50:43 +00:00
|
|
|
. /lib/dracut-lib.sh
|
2014-05-08 11:37:14 +00:00
|
|
|
. /lib/kdump-lib-initramfs.sh
|
2011-07-28 14:50:43 +00:00
|
|
|
|
2012-12-19 07:45:05 +00:00
|
|
|
set -o pipefail
|
2012-06-12 01:42:39 +00:00
|
|
|
DUMP_RETVAL=0
|
2012-04-28 10:01:18 +00:00
|
|
|
|
|
|
|
export PATH=$PATH:$KDUMP_SCRIPT_DIR
|
2012-02-22 03:16:09 +00:00
|
|
|
|
2013-08-02 06:22:23 +00:00
|
|
|
do_dump()
|
|
|
|
{
|
|
|
|
local _ret
|
|
|
|
|
|
|
|
eval $DUMP_INSTRUCTION
|
|
|
|
_ret=$?
|
|
|
|
|
|
|
|
if [ $_ret -ne 0 ]; then
|
|
|
|
echo "kdump: saving vmcore failed"
|
|
|
|
fi
|
|
|
|
|
|
|
|
return $_ret
|
|
|
|
}
|
|
|
|
|
2012-06-14 01:57:30 +00:00
|
|
|
do_kdump_pre()
|
|
|
|
{
|
|
|
|
if [ -n "$KDUMP_PRE" ]; then
|
|
|
|
"$KDUMP_PRE"
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2015-04-08 07:50:16 +00:00
|
|
|
do_kdump_post()
|
|
|
|
{
|
|
|
|
if [ -n "$KDUMP_POST" ]; then
|
|
|
|
"$KDUMP_POST" "$1"
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2011-08-01 12:01:31 +00:00
|
|
|
add_dump_code()
|
2011-07-28 14:50:43 +00:00
|
|
|
{
|
2012-06-12 01:42:39 +00:00
|
|
|
DUMP_INSTRUCTION=$1
|
2011-07-28 14:50:43 +00:00
|
|
|
}
|
|
|
|
|
2011-08-01 12:01:31 +00:00
|
|
|
dump_raw()
|
|
|
|
{
|
2013-06-21 03:23:58 +00:00
|
|
|
local _raw=$1
|
2012-04-28 10:01:18 +00:00
|
|
|
|
2013-06-21 03:23:58 +00:00
|
|
|
[ -b "$_raw" ] || return 1
|
|
|
|
|
|
|
|
echo "kdump: saving to raw disk $_raw"
|
2013-06-21 03:23:56 +00:00
|
|
|
|
2013-06-25 08:40:43 +00:00
|
|
|
if ! $(echo -n $CORE_COLLECTOR|grep -q makedumpfile); then
|
2012-04-28 10:01:18 +00:00
|
|
|
_src_size=`ls -l /proc/vmcore | cut -d' ' -f5`
|
|
|
|
_src_size_mb=$(($_src_size / 1048576))
|
2013-06-25 08:40:43 +00:00
|
|
|
monitor_dd_progress $_src_size_mb &
|
2012-04-28 10:01:18 +00:00
|
|
|
fi
|
|
|
|
|
2013-06-21 03:23:56 +00:00
|
|
|
echo "kdump: saving vmcore"
|
2013-06-21 03:23:58 +00:00
|
|
|
$CORE_COLLECTOR /proc/vmcore | dd of=$_raw bs=$DD_BLKSIZE >> /tmp/dd_progress_file 2>&1 || return 1
|
2013-06-26 05:15:18 +00:00
|
|
|
sync
|
2013-06-21 03:23:56 +00:00
|
|
|
|
|
|
|
echo "kdump: saving vmcore complete"
|
2012-12-19 09:27:40 +00:00
|
|
|
return 0
|
2011-08-01 12:01:31 +00:00
|
|
|
}
|
|
|
|
|
2011-07-28 14:50:43 +00:00
|
|
|
dump_ssh()
|
|
|
|
{
|
2012-06-14 01:56:10 +00:00
|
|
|
local _opt="-i $1 -o BatchMode=yes -o StrictHostKeyChecking=yes"
|
2013-02-01 03:00:12 +00:00
|
|
|
local _dir="$KDUMP_PATH/$HOST_IP-$DATEDIR"
|
2013-06-21 03:23:58 +00:00
|
|
|
local _host=$2
|
2012-06-14 01:56:10 +00:00
|
|
|
|
2013-06-21 03:23:58 +00:00
|
|
|
echo "kdump: saving to $_host:$_dir"
|
2013-06-21 03:23:56 +00:00
|
|
|
|
2012-11-14 05:58:37 +00:00
|
|
|
cat /var/lib/random-seed > /dev/urandom
|
2013-06-21 03:23:58 +00:00
|
|
|
ssh -q $_opt $_host mkdir -p $_dir || return 1
|
2012-06-14 01:56:10 +00:00
|
|
|
|
2013-06-21 03:23:58 +00:00
|
|
|
save_vmcore_dmesg_ssh ${DMESG_COLLECTOR} ${_dir} "${_opt}" $_host
|
2013-05-13 03:13:27 +00:00
|
|
|
|
2013-06-21 03:23:56 +00:00
|
|
|
echo "kdump: saving vmcore"
|
|
|
|
|
2013-05-28 09:53:59 +00:00
|
|
|
if [ "${CORE_COLLECTOR%%[[:blank:]]*}" = "scp" ]; then
|
2013-06-21 03:23:58 +00:00
|
|
|
scp -q $_opt /proc/vmcore "$_host:$_dir/vmcore-incomplete" || return 1
|
|
|
|
ssh $_opt $_host "mv $_dir/vmcore-incomplete $_dir/vmcore" || return 1
|
2012-06-14 01:56:10 +00:00
|
|
|
else
|
2013-06-21 03:23:58 +00:00
|
|
|
$CORE_COLLECTOR /proc/vmcore | ssh $_opt $_host "dd bs=512 of=$_dir/vmcore-incomplete" || return 1
|
|
|
|
ssh $_opt $_host "mv $_dir/vmcore-incomplete $_dir/vmcore.flat" || return 1
|
2012-06-14 01:56:10 +00:00
|
|
|
fi
|
2013-06-21 03:23:56 +00:00
|
|
|
|
|
|
|
echo "kdump: saving vmcore complete"
|
|
|
|
return 0
|
2012-06-14 01:56:10 +00:00
|
|
|
}
|
|
|
|
|
2013-05-13 03:13:27 +00:00
|
|
|
save_vmcore_dmesg_ssh() {
|
|
|
|
local _dmesg_collector=$1
|
|
|
|
local _path=$2
|
|
|
|
local _opts="$3"
|
|
|
|
local _location=$4
|
|
|
|
|
2013-06-21 03:23:56 +00:00
|
|
|
echo "kdump: saving vmcore-dmesg.txt"
|
2013-05-13 03:13:27 +00:00
|
|
|
$_dmesg_collector /proc/vmcore | ssh $_opts $_location "dd of=$_path/vmcore-dmesg-incomplete.txt"
|
|
|
|
_exitcode=$?
|
|
|
|
|
|
|
|
if [ $_exitcode -eq 0 ]; then
|
|
|
|
ssh -q $_opts $_location mv $_path/vmcore-dmesg-incomplete.txt $_path/vmcore-dmesg.txt
|
2013-06-21 03:23:56 +00:00
|
|
|
echo "kdump: saving vmcore-dmesg.txt complete"
|
2013-05-13 03:13:27 +00:00
|
|
|
else
|
2013-06-21 03:23:56 +00:00
|
|
|
echo "kdump: saving vmcore-dmesg.txt failed"
|
2013-05-13 03:13:27 +00:00
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2012-12-13 05:47:56 +00:00
|
|
|
get_host_ip()
|
|
|
|
{
|
2013-02-01 07:40:26 +00:00
|
|
|
local _host
|
2012-12-13 05:47:56 +00:00
|
|
|
if is_nfs_dump_target || is_ssh_dump_target
|
|
|
|
then
|
|
|
|
kdumpnic=$(getarg kdumpnic=)
|
2013-06-21 03:23:56 +00:00
|
|
|
[ -z "$kdumpnic" ] && echo "kdump: failed to get kdumpnic!" && return 1
|
2015-07-23 10:29:23 +00:00
|
|
|
_host=`ip addr show dev $kdumpnic|grep '[ ]*inet'`
|
2013-06-21 03:23:56 +00:00
|
|
|
[ $? -ne 0 ] && echo "kdump: wrong kdumpnic: $kdumpnic" && return 1
|
2015-07-23 10:29:23 +00:00
|
|
|
_host=`echo $_host | head -n 1 | cut -d' ' -f2`
|
2013-02-01 07:40:26 +00:00
|
|
|
_host="${_host%%/*}"
|
2013-06-21 03:23:56 +00:00
|
|
|
[ -z "$_host" ] && echo "kdump: wrong kdumpnic: $kdumpnic" && return 1
|
2013-02-01 07:40:26 +00:00
|
|
|
HOST_IP=$_host
|
2012-12-13 05:47:56 +00:00
|
|
|
fi
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
|
2011-07-28 14:50:43 +00:00
|
|
|
read_kdump_conf()
|
|
|
|
{
|
2014-05-08 11:37:14 +00:00
|
|
|
if [ ! -f "$KDUMP_CONF" ]; then
|
|
|
|
echo "kdump: $KDUMP_CONF not found"
|
2012-06-14 01:55:54 +00:00
|
|
|
return
|
2011-07-28 14:50:43 +00:00
|
|
|
fi
|
2012-06-14 01:55:54 +00:00
|
|
|
|
2014-05-08 11:37:14 +00:00
|
|
|
get_kdump_confs
|
2012-06-14 01:55:54 +00:00
|
|
|
|
|
|
|
# rescan for add code for dump target
|
|
|
|
while read config_opt config_val;
|
|
|
|
do
|
2013-09-26 11:46:48 +00:00
|
|
|
# remove inline comments after the end of a directive.
|
|
|
|
config_val=$(strip_comments $config_val)
|
2012-06-14 01:55:54 +00:00
|
|
|
case "$config_opt" in
|
Support special mount information via "dracut_args"
There are some complaints about nfs kdump that users must mount
nfs beforehand, which may cause some overhead to nfs server.
For example, there're thounsands of diskless clients deployed with
nfs dumping, each time the client is boot up, it will trigger
kdump rebuilding so will mount nfs, thus resulting in thousands
of nfs request concurrently imposed on the same nfs server.
We introduce a new way of specifying mount information via the
already-existent "dracut_args" directive(so avoid adding extra
directives in /etc/kdump.conf), we will skip all the filesystem
mounting and checking stuff for it. So it can be used in the
above-mentioned nfs scenario to avoid severe nfs server overhead.
Specifically, if there is any "--mount" information specified via
"dracut_args" in /etc/kdump.conf, always use it as the final mount
without any validation(mounting or checking like mount options,
fs size, etc), so users are expected to ensure its correctness.
NOTE:
-Only one mount target is allowed using "dracut_args" globally.
-Dracut will create <mountpoint> if it doesn't exist in kdump kernel,
<mountpoint> must be specified as an absolute path.
-Users should do a test first and ensure it works because kdump does
not prepare the mount or check all the validity.
Reviewed-by: Pratyush Anand <panand@redhat.com>
Suggested-by: Dave Young <dyoung@redhat.com>
Acked-by: Dave Young <dyoung@redhat.com>
Signed-off-by: Xunlei Pang <xlpang@redhat.com>
2016-08-26 03:23:35 +00:00
|
|
|
dracut_args)
|
|
|
|
config_val=$(get_dracut_args_target "$config_val")
|
2016-11-25 08:58:20 +00:00
|
|
|
[ -n "$config_val" ] && add_dump_code "dump_fs $config_val"
|
Support special mount information via "dracut_args"
There are some complaints about nfs kdump that users must mount
nfs beforehand, which may cause some overhead to nfs server.
For example, there're thounsands of diskless clients deployed with
nfs dumping, each time the client is boot up, it will trigger
kdump rebuilding so will mount nfs, thus resulting in thousands
of nfs request concurrently imposed on the same nfs server.
We introduce a new way of specifying mount information via the
already-existent "dracut_args" directive(so avoid adding extra
directives in /etc/kdump.conf), we will skip all the filesystem
mounting and checking stuff for it. So it can be used in the
above-mentioned nfs scenario to avoid severe nfs server overhead.
Specifically, if there is any "--mount" information specified via
"dracut_args" in /etc/kdump.conf, always use it as the final mount
without any validation(mounting or checking like mount options,
fs size, etc), so users are expected to ensure its correctness.
NOTE:
-Only one mount target is allowed using "dracut_args" globally.
-Dracut will create <mountpoint> if it doesn't exist in kdump kernel,
<mountpoint> must be specified as an absolute path.
-Users should do a test first and ensure it works because kdump does
not prepare the mount or check all the validity.
Reviewed-by: Pratyush Anand <panand@redhat.com>
Suggested-by: Dave Young <dyoung@redhat.com>
Acked-by: Dave Young <dyoung@redhat.com>
Signed-off-by: Xunlei Pang <xlpang@redhat.com>
2016-08-26 03:23:35 +00:00
|
|
|
;;
|
2012-07-23 07:31:28 +00:00
|
|
|
ext[234]|xfs|btrfs|minix|nfs)
|
2012-07-23 07:31:15 +00:00
|
|
|
add_dump_code "dump_fs $config_val"
|
2012-06-14 01:55:54 +00:00
|
|
|
;;
|
|
|
|
raw)
|
|
|
|
add_dump_code "dump_raw $config_val"
|
|
|
|
;;
|
2012-07-23 07:31:28 +00:00
|
|
|
ssh)
|
|
|
|
add_dump_code "dump_ssh $SSH_KEY_LOCATION $config_val"
|
2012-06-14 01:55:54 +00:00
|
|
|
;;
|
|
|
|
esac
|
2014-05-08 11:37:14 +00:00
|
|
|
done < $KDUMP_CONF
|
2011-07-28 14:50:43 +00:00
|
|
|
}
|
|
|
|
|
2013-12-20 07:09:48 +00:00
|
|
|
fence_kdump_notify()
|
|
|
|
{
|
2014-04-02 08:33:47 +00:00
|
|
|
if [ -n "$FENCE_KDUMP_NODES" ]; then
|
|
|
|
$FENCE_KDUMP_SEND $FENCE_KDUMP_ARGS $FENCE_KDUMP_NODES &
|
2013-12-20 07:09:48 +00:00
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2011-07-28 14:50:43 +00:00
|
|
|
read_kdump_conf
|
2014-04-02 08:33:47 +00:00
|
|
|
fence_kdump_notify
|
2011-07-28 14:50:43 +00:00
|
|
|
|
2012-12-13 05:47:56 +00:00
|
|
|
get_host_ip
|
|
|
|
if [ $? -ne 0 ]; then
|
2013-06-21 03:23:56 +00:00
|
|
|
echo "kdump: get_host_ip exited with non-zero status!"
|
2014-05-08 11:37:16 +00:00
|
|
|
exit 1
|
2012-12-13 05:47:56 +00:00
|
|
|
fi
|
|
|
|
|
2012-06-12 01:42:29 +00:00
|
|
|
if [ -z "$DUMP_INSTRUCTION" ]; then
|
2013-06-27 15:11:10 +00:00
|
|
|
add_dump_code "dump_fs $NEWROOT"
|
2011-07-28 14:50:43 +00:00
|
|
|
fi
|
|
|
|
|
2012-06-14 01:57:30 +00:00
|
|
|
do_kdump_pre
|
|
|
|
if [ $? -ne 0 ]; then
|
2013-06-21 03:23:56 +00:00
|
|
|
echo "kdump: kdump_pre script exited with non-zero status!"
|
2013-06-21 03:24:00 +00:00
|
|
|
do_final_action
|
2012-06-14 01:57:30 +00:00
|
|
|
fi
|
2013-11-19 07:37:53 +00:00
|
|
|
make_trace_mem "kdump saving vmcore" '1:shortmem' '2+:mem' '3+:slab'
|
2013-08-02 06:22:23 +00:00
|
|
|
do_dump
|
2012-06-12 01:42:39 +00:00
|
|
|
DUMP_RETVAL=$?
|
2012-06-14 01:57:30 +00:00
|
|
|
|
|
|
|
do_kdump_post $DUMP_RETVAL
|
|
|
|
if [ $? -ne 0 ]; then
|
2013-06-21 03:23:56 +00:00
|
|
|
echo "kdump: kdump_post script exited with non-zero status!"
|
2012-06-14 01:57:30 +00:00
|
|
|
fi
|
|
|
|
|
2012-06-12 01:42:39 +00:00
|
|
|
if [ $DUMP_RETVAL -ne 0 ]; then
|
2014-05-08 11:37:16 +00:00
|
|
|
exit 1
|
2012-06-12 01:42:39 +00:00
|
|
|
fi
|
|
|
|
|
2013-06-21 03:24:00 +00:00
|
|
|
do_final_action
|