ssh core_collector fix

1. add core_collector filter support to ssh dump
2. scp can be specified in kdump.conf
3. error out if no '-F' with makedumpfile
4. add proper explanation and examples to kdump.conf[.5] and kexec-kdump-howto.txt.

v1->v2: add verify_core_collector function
v2->v3: optimize the code, remove local variable for default core_collector

Signed-off-by: Dave Young <dyoung@redhat.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
This commit is contained in:
Dave Young 2012-06-14 09:56:10 +08:00
parent 33d933f800
commit 2697669fa9
5 changed files with 110 additions and 15 deletions

View File

@ -4,7 +4,8 @@
set -x set -x
KDUMP_PATH="/var/crash" KDUMP_PATH="/var/crash"
CORE_COLLECTOR="makedumpfile -c --message-level 1 -d 31" CORE_COLLECTOR=""
DEFAULT_CORE_COLLECTOR="makedumpfile -c --message-level 1 -d 31"
DEFAULT_ACTION="dump_rootfs" DEFAULT_ACTION="dump_rootfs"
DATEDIR=`date +%d.%m.%y-%T` DATEDIR=`date +%d.%m.%y-%T`
DUMP_INSTRUCTION="" DUMP_INSTRUCTION=""
@ -118,9 +119,23 @@ dump_nfs()
dump_ssh() dump_ssh()
{ {
ssh -q -i $1 -o BatchMode=yes -o StrictHostKeyChecking=yes $2 mkdir -p $KDUMP_PATH/$DATEDIR || return 1 local _opt="-i $1 -o BatchMode=yes -o StrictHostKeyChecking=yes"
scp -q -i $1 -o BatchMode=yes -o StrictHostKeyChecking=yes /proc/vmcore "$2:$KDUMP_PATH/$DATEDIR" || return 1 local _dir="$KDUMP_PATH/$DATEDIR"
return 0
ssh -q $_opt $2 mkdir -p $_dir || return 1
if [ "${CORE_COLLECTOR%% *}" = "scp" ]; then
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
}
is_ssh_dump_target()
{
grep -q "^net.*@" $conf_file
} }
read_kdump_conf() read_kdump_conf()
@ -188,6 +203,11 @@ read_kdump_conf()
read_kdump_conf read_kdump_conf
if [ -z "$CORE_COLLECTOR" ];then
CORE_COLLECTOR=$DEFAULT_CORE_COLLECTOR
is_ssh_dump_target && CORE_COLLECTOR="$CORE_COLLECTOR -F"
fi
if [ -z "$DUMP_INSTRUCTION" ]; then if [ -z "$DUMP_INSTRUCTION" ]; then
add_dump_code "dump_rootfs" add_dump_code "dump_rootfs"
fi fi

View File

@ -44,7 +44,7 @@
# options are not needed here, as the initrd will # options are not needed here, as the initrd will
# automatically be populated with a config file # automatically be populated with a config file
# appropriate for the running kernel. # appropriate for the running kernel.
# Default core_collector for raw dump is: # Default core_collector for raw/ssh dump is:
# "makedumpfile -F -c --message-level 1 -d 31". # "makedumpfile -F -c --message-level 1 -d 31".
# Default core_collector for other targets is: # Default core_collector for other targets is:
# "makedumpfile -c --message-level 1 -d 31". # "makedumpfile -c --message-level 1 -d 31".
@ -91,6 +91,7 @@
#sshkey /root/.ssh/kdump_id_rsa #sshkey /root/.ssh/kdump_id_rsa
path /var/crash path /var/crash
#core_collector makedumpfile -c --message-level 1 -d 31 #core_collector makedumpfile -c --message-level 1 -d 31
#core_collector scp
#extra_bins /usr/bin/lftp #extra_bins /usr/bin/lftp
#extra_modules gfs2 #extra_modules gfs2
#default shell #default shell

View File

@ -72,7 +72,7 @@ will automatically be populated with a config file appropriate
for the running kernel. for the running kernel.
.PP .PP
Note 1: About default core collector: Note 1: About default core collector:
Default core_collector for raw dump is: Default core_collector for raw/ssh dump is:
"makedumpfile -F -c --message-level 1 -d 31". "makedumpfile -F -c --message-level 1 -d 31".
Default core_collector for other targets is: Default core_collector for other targets is:
"makedumpfile -c --message-level 1 -d 31". "makedumpfile -c --message-level 1 -d 31".
@ -141,10 +141,10 @@ Above will effectively be translated to:
makedumpfile -c --message-level 1 -d 31 /proc/vmcore <dest-path>/vmcore makedumpfile -c --message-level 1 -d 31 /proc/vmcore <dest-path>/vmcore
.PP .PP
For dump targets like raw, in general, core collector should expect For dump targets like raw and ssh, in general, core collector should expect
one argument (source file) and should output the processed core on standard one argument (source file) and should output the processed core on standard
output. This standard output will be saved to destination using appropriate output (There is one exception of "scp", discussed later). This standard
commands. output will be saved to destination using appropriate commands.
raw dumps examples: raw dumps examples:
.TP .TP
@ -161,6 +161,34 @@ core_collector "makedumpfile -F -c --message-level 1 -d 31"
Above will effectively be translated to. Above will effectively be translated to.
makedumpfile -F -c --message-level 1 -d 31 | dd of=<target-device> makedumpfile -F -c --message-level 1 -d 31 | dd of=<target-device>
.PP
ssh dumps examples
.TP
ex5.
core_collector "cat"
Above will effectively be translated to.
cat /proc/vmcore | ssh <options> <remote-location> "dd of=path/vmcore"
.TP
ex6.
core_collector "makedumpfile -F -c --message-level 1 -d 31"
Above will effectively be translated to.
makedumpfile -F -c --message-level 1 -d 31 | ssh <options> <remote-location> "dd of=path/vmcore"
There is one exception to standard output rule for ssh dumps. And that is
scp. As scp can handle ssh destinations for file transfers, one can
specify "scp" as core collector for ssh targets (no output on stdout).
.TP
ex7.
core_collector "scp"
Above will effectively be translated to.
scp /proc/vmcore <user@host>:path/vmcore
.PP .PP
examples for other options please see examples for other options please see
.I /etc/kdump.conf .I /etc/kdump.conf

View File

@ -467,10 +467,10 @@ Above will effectively be translated to:
makedumpfile -c --message-level 1 -d 31 /proc/vmcore <dest-path>/vmcore makedumpfile -c --message-level 1 -d 31 /proc/vmcore <dest-path>/vmcore
For dump targets like raw, in general, core collector should expect For dump targets like raw and ssh, in general, core collector should expect
one argument (source file) and should output the processed core on standard one argument (source file) and should output the processed core on standard
output. This standard output will be saved to destination using appropriate output (There is one exception of "scp", discussed later). This standard
commands. output will be saved to destination using appropriate commands.
raw dumps core_collector examples: raw dumps core_collector examples:
--------- ---------
@ -490,6 +490,36 @@ Above will effectively be translated to.
makedumpfile -F -c --message-level 1 -d 31 | dd of=<target-device> makedumpfile -F -c --message-level 1 -d 31 | dd of=<target-device>
ssh dumps core_collector examples:
---------
ex5.
---
core_collector "cat"
Above will effectively be translated to.
cat /proc/vmcore | ssh <options> <remote-location> "dd of=path/vmcore"
ex6.
---
core_collector "makedumpfile -F -c --message-level 1 -d 31"
Above will effectively be translated to.
makedumpfile -F -c --message-level 1 -d 31 | ssh <options> <remote-location> "dd of=path/vmcore"
There is one exception to standard output rule for ssh dumps. And that is
scp. As scp can handle ssh destinations for file transfers, one can
specify "scp" as core collector for ssh targets (no output on stdout).
ex7.
----
core_collector "scp"
Above will effectively be translated to.
scp /proc/vmcore <user@host>:path/vmcore
About default core collector About default core collector
---------------------------- ----------------------------
Default core_collector for ssh/raw dump is: Default core_collector for ssh/raw dump is:

View File

@ -91,6 +91,24 @@ check_remote() {
return return
} }
is_ssh_dump_target()
{
grep -q "^net.*@" $conf_file
}
# $1: core_collector config value
verify_core_collector() {
if grep -q "^raw" $conf_file && [ "${1%% *}" != "makedumpfile" ]; then
echo "Warning: specifying a non-makedumpfile core collector, you will have to recover the vmcore manually."
fi
if is_ssh_dump_target && [ "${1%% *}" = "makedumpfile" ]; then
! strstr "$1" "-F" && {
echo "The specified dump target needs makedumpfile \"-F\" option."
exit 1
}
fi
}
add_mount() { add_mount() {
local _dev=$(to_dev_name "$1") local _dev=$(to_dev_name "$1")
local _mnt=$(to_mount "$1") local _mnt=$(to_mount "$1")
@ -150,9 +168,7 @@ do
fi fi
;; ;;
core_collector) core_collector)
if grep -q "^raw" $conf_file && [ "${config_val%% *}" != "makedumpfile" ]; then verify_core_collector "$config_val"
echo "Warning: specifying a non-makedumpfile core collector, you will have to recover the vmcore manually."
fi
add_dracut_arg "-I" "${config_val%% *}" add_dracut_arg "-I" "${config_val%% *}"
;; ;;
extra_bins) extra_bins)