2011-07-28 14:50:43 +00:00
|
|
|
#!/bin/sh
|
|
|
|
|
2013-05-24 05:30:28 +00:00
|
|
|
exec >&2
|
2011-07-28 14:50:43 +00:00
|
|
|
. /lib/dracut-lib.sh
|
|
|
|
|
2012-12-19 07:45:05 +00:00
|
|
|
set -o pipefail
|
2011-07-28 14:50:43 +00:00
|
|
|
set -x
|
|
|
|
KDUMP_PATH="/var/crash"
|
2012-06-14 01:56:10 +00:00
|
|
|
CORE_COLLECTOR=""
|
|
|
|
DEFAULT_CORE_COLLECTOR="makedumpfile -c --message-level 1 -d 31"
|
2013-05-13 03:13:27 +00:00
|
|
|
DMESG_COLLECTOR="/sbin/vmcore-dmesg"
|
Change dump_to_rootfs to be a default option and reboot to be default action
Firstly rename dump_rootfs to dump_to_rootfs to remove the ambiguity
about dump_rootfs. Then add it as one of default options. That means
user can specify dump_to_rootfs to be default action manually, then
it will take action when specified target dump failed.
Secondly, in rhel7 and fedora, when default action is not specified,
the default 'default' is dump_to_rootfs. Namely when specified target
dump failed, the kdump initrd will mount root and save kdump from
initramfs context. However in rhel6, the default 'default' is 'reboot'.
That means when specified target dump failed, the kdump initrd will
reboot systems. For being consistent with rhel6, change the default
'default' back to 'reboot'. And this can also keep logic simple, easier
to understand. Primarily, Our default dump target is root filesystem.
So keeping "default" as "dump_to_rootfs" and trying to dump to root
filesystem again when first attempt fails does not make much sense.
Meanwhile add the relevant description into kdump.conf,kdump.conf.5
and kexec-kdump-howto.txt.
Signed-off-by: Baoquan He <bhe@redhat.com>
Acked-by: Dave Young <dyoung@redhat.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2013-03-01 07:14:19 +00:00
|
|
|
DEFAULT_ACTION="reboot -f"
|
2012-12-13 05:47:56 +00:00
|
|
|
DATEDIR=`date +%Y.%m.%d-%T`
|
|
|
|
HOST_IP='127.0.0.1'
|
2011-07-28 14:50:43 +00:00
|
|
|
DUMP_INSTRUCTION=""
|
2012-02-22 03:16:09 +00:00
|
|
|
SSH_KEY_LOCATION="/root/.ssh/kdump_id_rsa"
|
2012-04-28 10:01:18 +00:00
|
|
|
KDUMP_SCRIPT_DIR="/kdumpscripts"
|
|
|
|
DD_BLKSIZE=512
|
2012-06-12 01:42:39 +00:00
|
|
|
FINAL_ACTION="reboot -f"
|
|
|
|
DUMP_RETVAL=0
|
2012-06-14 01:55:54 +00:00
|
|
|
conf_file="/etc/kdump.conf"
|
2012-06-14 01:57:30 +00:00
|
|
|
KDUMP_PRE=""
|
|
|
|
KDUMP_POST=""
|
2012-04-28 10:01:18 +00:00
|
|
|
|
|
|
|
export PATH=$PATH:$KDUMP_SCRIPT_DIR
|
2012-02-22 03:16:09 +00:00
|
|
|
|
2011-07-28 14:50:43 +00:00
|
|
|
do_default_action()
|
|
|
|
{
|
|
|
|
wait_for_loginit
|
|
|
|
$DEFAULT_ACTION
|
|
|
|
}
|
|
|
|
|
2012-06-14 01:57:30 +00:00
|
|
|
do_kdump_pre()
|
|
|
|
{
|
|
|
|
if [ -n "$KDUMP_PRE" ]; then
|
|
|
|
"$KDUMP_PRE"
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
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
|
|
|
}
|
|
|
|
|
2012-07-23 07:31:15 +00:00
|
|
|
dump_fs()
|
2011-08-01 12:01:31 +00:00
|
|
|
{
|
2012-09-20 03:03:19 +00:00
|
|
|
local _mp=$(findmnt -k -f -n -r -o TARGET $1)
|
2012-07-23 07:31:08 +00:00
|
|
|
|
|
|
|
if [ -z "$_mp" ]; then
|
|
|
|
echo "kdump: error: Dump target $1 is not mounted."
|
|
|
|
return 1
|
|
|
|
fi
|
2012-01-25 07:25:39 +00:00
|
|
|
if [ "$_mp" = "$NEWROOT/" ] || [ "$_mp" = "$NEWROOT" ]
|
2011-08-02 10:10:16 +00:00
|
|
|
then
|
|
|
|
mount -o remount,rw $_mp || return 1
|
|
|
|
fi
|
2013-02-01 03:00:12 +00:00
|
|
|
mkdir -p $_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR || return 1
|
2013-05-13 03:13:27 +00:00
|
|
|
|
|
|
|
save_vmcore_dmesg_fs ${DMESG_COLLECTOR} "$_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/"
|
|
|
|
|
2013-02-01 03:00:12 +00:00
|
|
|
$CORE_COLLECTOR /proc/vmcore $_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/vmcore || return 1
|
2011-08-02 06:00:50 +00:00
|
|
|
umount $_mp || return 1
|
2011-08-01 12:01:31 +00:00
|
|
|
return 0
|
|
|
|
}
|
|
|
|
|
|
|
|
dump_raw()
|
|
|
|
{
|
2012-04-28 10:01:18 +00:00
|
|
|
[ -b "$1" ] || return 1
|
|
|
|
|
|
|
|
echo "Saving to raw disk $1"
|
|
|
|
if $(echo -n $CORE_COLLECTOR|grep -q makedumpfile); then
|
|
|
|
_src_size_mb="Unknown"
|
|
|
|
else
|
|
|
|
_src_size=`ls -l /proc/vmcore | cut -d' ' -f5`
|
|
|
|
_src_size_mb=$(($_src_size / 1048576))
|
|
|
|
fi
|
|
|
|
|
|
|
|
monitor_dd_progress $_src_size_mb &
|
|
|
|
|
|
|
|
$CORE_COLLECTOR /proc/vmcore | dd of=$1 bs=$DD_BLKSIZE >> /tmp/dd_progress_file 2>&1 || return 1
|
2012-12-19 09:27:40 +00:00
|
|
|
return 0
|
2011-08-01 12:01:31 +00:00
|
|
|
}
|
|
|
|
|
Change dump_to_rootfs to be a default option and reboot to be default action
Firstly rename dump_rootfs to dump_to_rootfs to remove the ambiguity
about dump_rootfs. Then add it as one of default options. That means
user can specify dump_to_rootfs to be default action manually, then
it will take action when specified target dump failed.
Secondly, in rhel7 and fedora, when default action is not specified,
the default 'default' is dump_to_rootfs. Namely when specified target
dump failed, the kdump initrd will mount root and save kdump from
initramfs context. However in rhel6, the default 'default' is 'reboot'.
That means when specified target dump failed, the kdump initrd will
reboot systems. For being consistent with rhel6, change the default
'default' back to 'reboot'. And this can also keep logic simple, easier
to understand. Primarily, Our default dump target is root filesystem.
So keeping "default" as "dump_to_rootfs" and trying to dump to root
filesystem again when first attempt fails does not make much sense.
Meanwhile add the relevant description into kdump.conf,kdump.conf.5
and kexec-kdump-howto.txt.
Signed-off-by: Baoquan He <bhe@redhat.com>
Acked-by: Dave Young <dyoung@redhat.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2013-03-01 07:14:19 +00:00
|
|
|
dump_to_rootfs()
|
2011-07-28 14:50:43 +00:00
|
|
|
{
|
2013-03-01 07:14:20 +00:00
|
|
|
#For dumping to rootfs, "-F" need be removed. Surely only available for makedumpfile case.
|
|
|
|
[[ $CORE_COLLECTOR = *makedumpfile* ]] && CORE_COLLECTOR=`echo $CORE_COLLECTOR | sed -e s/-F//g`
|
|
|
|
|
2011-07-28 14:50:43 +00:00
|
|
|
mount -o remount,rw $NEWROOT/ || return 1
|
2013-02-01 03:00:12 +00:00
|
|
|
mkdir -p $NEWROOT/$KDUMP_PATH/$HOST_IP-$DATEDIR
|
2013-05-13 03:13:27 +00:00
|
|
|
|
|
|
|
save_vmcore_dmesg_fs ${DMESG_COLLECTOR} "$NEWROOT/$KDUMP_PATH/$HOST_IP-$DATEDIR/"
|
|
|
|
|
2013-02-01 03:00:12 +00:00
|
|
|
$CORE_COLLECTOR /proc/vmcore $NEWROOT/$KDUMP_PATH/$HOST_IP-$DATEDIR/vmcore || return 1
|
2011-07-28 14:50:43 +00:00
|
|
|
sync
|
2013-06-06 06:56:50 +00:00
|
|
|
umount $NEWROOT || return 1
|
|
|
|
return 0
|
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"
|
2012-06-14 01:56:10 +00:00
|
|
|
|
2012-11-14 05:58:37 +00:00
|
|
|
cat /var/lib/random-seed > /dev/urandom
|
2012-06-14 01:56:10 +00:00
|
|
|
ssh -q $_opt $2 mkdir -p $_dir || return 1
|
|
|
|
|
2013-05-13 03:13:27 +00:00
|
|
|
save_vmcore_dmesg_ssh ${DMESG_COLLECTOR} ${_dir} "${_opt}" $2
|
|
|
|
|
2013-05-28 09:53:59 +00:00
|
|
|
if [ "${CORE_COLLECTOR%%[[:blank:]]*}" = "scp" ]; then
|
2012-06-14 01:56:10 +00:00
|
|
|
scp -q $_opt /proc/vmcore "$2:$_dir/vmcore-incomplete" || return 1
|
|
|
|
ssh $_opt $2 "mv $_dir/vmcore-incomplete $_dir/vmcore" || return 1
|
|
|
|
else
|
|
|
|
$CORE_COLLECTOR /proc/vmcore | ssh $_opt $2 "dd bs=512 of=$_dir/vmcore-incomplete" || return 1
|
|
|
|
ssh $_opt $2 "mv $_dir/vmcore-incomplete $_dir/vmcore.flat" || return 1
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2013-05-13 03:13:27 +00:00
|
|
|
save_vmcore_dmesg_fs() {
|
|
|
|
local _dmesg_collector=$1
|
|
|
|
local _path=$2
|
|
|
|
|
|
|
|
echo "Saving vmcore-dmesg.txt"
|
|
|
|
$_dmesg_collector /proc/vmcore > ${_path}/vmcore-dmesg-incomplete.txt
|
|
|
|
_exitcode=$?
|
|
|
|
if [ $_exitcode -eq 0 ]; then
|
|
|
|
mv ${_path}/vmcore-dmesg-incomplete.txt ${_path}/vmcore-dmesg.txt
|
|
|
|
echo "Saved vmcore-dmesg.txt"
|
|
|
|
else
|
|
|
|
echo "Saving vmcore-dmesg.txt failed"
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
save_vmcore_dmesg_ssh() {
|
|
|
|
local _dmesg_collector=$1
|
|
|
|
local _path=$2
|
|
|
|
local _opts="$3"
|
|
|
|
local _location=$4
|
|
|
|
|
|
|
|
echo "Saving vmcore-dmesg.txt"
|
|
|
|
$_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
|
|
|
|
echo "Saved vmcore-dmesg.txt"
|
|
|
|
else
|
|
|
|
echo "Saving vmcore-dmesg.txt failed"
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2012-06-14 01:56:10 +00:00
|
|
|
is_ssh_dump_target()
|
|
|
|
{
|
2012-11-14 05:56:50 +00:00
|
|
|
grep -q "^ssh[[:blank:]].*@" $conf_file
|
2011-07-28 14:50:43 +00:00
|
|
|
}
|
|
|
|
|
2012-12-13 05:47:56 +00:00
|
|
|
is_nfs_dump_target()
|
|
|
|
{
|
|
|
|
grep -q "^nfs.*:" $conf_file
|
|
|
|
}
|
|
|
|
|
2012-06-14 01:57:07 +00:00
|
|
|
is_raw_dump_target()
|
|
|
|
{
|
|
|
|
grep -q "^raw" $conf_file
|
|
|
|
}
|
|
|
|
|
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=)
|
|
|
|
[ -z "$kdumpnic" ] && echo "failed to get kdumpnic!" && return 1
|
2013-02-01 07:40:26 +00:00
|
|
|
_host=`ip addr show dev $kdumpnic|grep 'inet '`
|
2012-12-13 05:47:56 +00:00
|
|
|
[ $? -ne 0 ] && echo "Wrong kdumpnic: $kdumpnic" && return 1
|
2013-02-01 07:40:26 +00:00
|
|
|
_host="${_host##*inet }"
|
|
|
|
_host="${_host%%/*}"
|
|
|
|
[ -z "$_host" ] && echo "Wrong kdumpnic: $kdumpnic" && return 1
|
|
|
|
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()
|
|
|
|
{
|
2012-06-14 01:55:54 +00:00
|
|
|
if [ ! -f "$conf_file" ]; then
|
|
|
|
echo "$conf_file not found"
|
|
|
|
return
|
2011-07-28 14:50:43 +00:00
|
|
|
fi
|
2012-06-14 01:55:54 +00:00
|
|
|
|
|
|
|
# first get the necessary variables
|
|
|
|
while read config_opt config_val;
|
|
|
|
do
|
|
|
|
case "$config_opt" in
|
|
|
|
path)
|
|
|
|
KDUMP_PATH="$config_val"
|
|
|
|
;;
|
|
|
|
core_collector)
|
|
|
|
[ -n "$config_val" ] && CORE_COLLECTOR="$config_val"
|
|
|
|
;;
|
|
|
|
sshkey)
|
|
|
|
if [ -f "$config_val" ]; then
|
|
|
|
SSH_KEY_LOCATION=$config_val
|
|
|
|
fi
|
|
|
|
;;
|
2012-06-14 01:57:30 +00:00
|
|
|
kdump_pre)
|
|
|
|
KDUMP_PRE="$config_val"
|
|
|
|
;;
|
|
|
|
kdump_post)
|
|
|
|
KDUMP_POST="$config_val"
|
|
|
|
;;
|
2012-06-14 01:55:54 +00:00
|
|
|
default)
|
|
|
|
case $config_val in
|
|
|
|
shell)
|
2012-08-01 10:14:42 +00:00
|
|
|
DEFAULT_ACTION="_emergency_shell kdump"
|
2012-06-14 01:55:54 +00:00
|
|
|
;;
|
|
|
|
reboot)
|
|
|
|
DEFAULT_ACTION="reboot -f"
|
|
|
|
;;
|
|
|
|
halt)
|
|
|
|
DEFAULT_ACTION="halt -f"
|
|
|
|
;;
|
|
|
|
poweroff)
|
|
|
|
DEFAULT_ACTION="poweroff -f"
|
|
|
|
;;
|
Change dump_to_rootfs to be a default option and reboot to be default action
Firstly rename dump_rootfs to dump_to_rootfs to remove the ambiguity
about dump_rootfs. Then add it as one of default options. That means
user can specify dump_to_rootfs to be default action manually, then
it will take action when specified target dump failed.
Secondly, in rhel7 and fedora, when default action is not specified,
the default 'default' is dump_to_rootfs. Namely when specified target
dump failed, the kdump initrd will mount root and save kdump from
initramfs context. However in rhel6, the default 'default' is 'reboot'.
That means when specified target dump failed, the kdump initrd will
reboot systems. For being consistent with rhel6, change the default
'default' back to 'reboot'. And this can also keep logic simple, easier
to understand. Primarily, Our default dump target is root filesystem.
So keeping "default" as "dump_to_rootfs" and trying to dump to root
filesystem again when first attempt fails does not make much sense.
Meanwhile add the relevant description into kdump.conf,kdump.conf.5
and kexec-kdump-howto.txt.
Signed-off-by: Baoquan He <bhe@redhat.com>
Acked-by: Dave Young <dyoung@redhat.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2013-03-01 07:14:19 +00:00
|
|
|
dump_to_rootfs)
|
|
|
|
DEFAULT_ACTION="dump_to_rootfs"
|
|
|
|
;;
|
2012-06-14 01:55:54 +00:00
|
|
|
esac
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
done < $conf_file
|
|
|
|
|
|
|
|
# rescan for add code for dump target
|
|
|
|
while read config_opt config_val;
|
|
|
|
do
|
|
|
|
case "$config_opt" in
|
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
|
|
|
|
done < $conf_file
|
2011-07-28 14:50:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
read_kdump_conf
|
|
|
|
|
2012-06-14 01:56:10 +00:00
|
|
|
if [ -z "$CORE_COLLECTOR" ];then
|
|
|
|
CORE_COLLECTOR=$DEFAULT_CORE_COLLECTOR
|
2012-06-14 01:57:07 +00:00
|
|
|
if is_ssh_dump_target || is_raw_dump_target; then
|
|
|
|
CORE_COLLECTOR="$CORE_COLLECTOR -F"
|
|
|
|
fi
|
2012-06-14 01:56:10 +00:00
|
|
|
fi
|
|
|
|
|
2012-12-13 05:47:56 +00:00
|
|
|
get_host_ip
|
|
|
|
if [ $? -ne 0 ]; then
|
|
|
|
echo "get_host_ip exited with non-zero status!"
|
|
|
|
do_default_action
|
2013-02-01 03:00:12 +00:00
|
|
|
$FINAL_ACTION
|
2012-12-13 05:47:56 +00:00
|
|
|
fi
|
|
|
|
|
2012-06-12 01:42:29 +00:00
|
|
|
if [ -z "$DUMP_INSTRUCTION" ]; then
|
Change dump_to_rootfs to be a default option and reboot to be default action
Firstly rename dump_rootfs to dump_to_rootfs to remove the ambiguity
about dump_rootfs. Then add it as one of default options. That means
user can specify dump_to_rootfs to be default action manually, then
it will take action when specified target dump failed.
Secondly, in rhel7 and fedora, when default action is not specified,
the default 'default' is dump_to_rootfs. Namely when specified target
dump failed, the kdump initrd will mount root and save kdump from
initramfs context. However in rhel6, the default 'default' is 'reboot'.
That means when specified target dump failed, the kdump initrd will
reboot systems. For being consistent with rhel6, change the default
'default' back to 'reboot'. And this can also keep logic simple, easier
to understand. Primarily, Our default dump target is root filesystem.
So keeping "default" as "dump_to_rootfs" and trying to dump to root
filesystem again when first attempt fails does not make much sense.
Meanwhile add the relevant description into kdump.conf,kdump.conf.5
and kexec-kdump-howto.txt.
Signed-off-by: Baoquan He <bhe@redhat.com>
Acked-by: Dave Young <dyoung@redhat.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
2013-03-01 07:14:19 +00:00
|
|
|
add_dump_code "dump_to_rootfs"
|
2011-07-28 14:50:43 +00:00
|
|
|
fi
|
|
|
|
|
2012-06-14 01:57:30 +00:00
|
|
|
do_kdump_pre
|
|
|
|
if [ $? -ne 0 ]; then
|
|
|
|
echo "kdump_pre script exited with non-zero status!"
|
|
|
|
$FINAL_ACTION
|
|
|
|
fi
|
|
|
|
|
2012-06-12 01:42:39 +00:00
|
|
|
$DUMP_INSTRUCTION
|
|
|
|
DUMP_RETVAL=$?
|
2012-06-14 01:57:30 +00:00
|
|
|
|
|
|
|
do_kdump_post $DUMP_RETVAL
|
|
|
|
if [ $? -ne 0 ]; then
|
|
|
|
echo "kdump_post script exited with non-zero status!"
|
|
|
|
fi
|
|
|
|
|
2012-06-12 01:42:39 +00:00
|
|
|
if [ $DUMP_RETVAL -ne 0 ]; then
|
|
|
|
do_default_action
|
|
|
|
fi
|
|
|
|
|
|
|
|
$FINAL_ACTION
|