From cd8614880498258d05907a05c45b75854ce288c5 Mon Sep 17 00:00:00 2001 From: Lianbo Jiang Date: Mon, 14 Dec 2020 17:01:42 +0800 Subject: [PATCH] Save the final failure information to log file if saving vmcore failed Currently, if saving vmcore failed, the final failure information won't be saved to the kexec-dmesg.log, because the action of saving the log occurs before the final log is printed, it has no chance to save the log(marked it with the '^^^' below) to the log file(kexec-dmesg.log). For example: [1] console log: [ 3.589967] kdump[453]: saving vmcore-dmesg.txt to /sysroot//var/crash/127.0.0.1-2020-11-26-14:19:17/ [ 3.627261] kdump[458]: saving vmcore-dmesg.txt complete [ 3.633923] kdump[460]: saving vmcore [ 3.661020] kdump[465]: saving vmcore failed ^^^^^^^^^^^^^^^^^^^^ [2] kexec-dmesg.log: Nov 26 14:19:17 kvm-06-guest25.hv2.lab.eng.bos.redhat.com kdump[453]: saving vmcore-dmesg.txt to /sysroot//var/crash/127.0.0.1-2020-11-26-14:19:17/ Nov 26 14:19:17 kvm-06-guest25.hv2.lab.eng.bos.redhat.com kdump[458]: saving vmcore-dmesg.txt complete Nov 26 14:19:17 kvm-06-guest25.hv2.lab.eng.bos.redhat.com kdump[460]: saving vmcore Let's improve it in order to avoid the loss of important information. Signed-off-by: Lianbo Jiang Acked-by: Kairui Song --- dracut-kdump.sh | 45 +++++++++++++++++++++++++++--------------- kdump-lib-initramfs.sh | 20 +++++++++++-------- 2 files changed, 41 insertions(+), 24 deletions(-) diff --git a/dracut-kdump.sh b/dracut-kdump.sh index c2627c2..370d217 100755 --- a/dracut-kdump.sh +++ b/dracut-kdump.sh @@ -105,10 +105,12 @@ dump_raw() dump_ssh() { - local ret + local _ret=0 + local _exitcode=0 _exitcode2=0 local _opt="-i $1 -o BatchMode=yes -o StrictHostKeyChecking=yes" local _dir="$KDUMP_PATH/$HOST_IP-$DATEDIR" local _host=$2 + local _vmcore="vmcore" dinfo "saving to $_host:$_dir" @@ -122,25 +124,36 @@ dump_ssh() if [ "${CORE_COLLECTOR%%[[:blank:]]*}" = "scp" ]; then scp -q $_opt /proc/vmcore "$_host:$_dir/vmcore-incomplete" - ret=$? - save_log - scp -q $_opt $KDUMP_LOG_FILE "$_host:$_dir/" - if [ $ret -ne 0 ]; then - return 1 - fi - ssh $_opt $_host "mv $_dir/vmcore-incomplete $_dir/vmcore" || return 1 + _exitcode=$? else $CORE_COLLECTOR /proc/vmcore | ssh $_opt $_host "dd bs=512 of=$_dir/vmcore-incomplete" - ret=$? - save_log - scp -q $_opt $KDUMP_LOG_FILE "$_host:$_dir/" - if [ $ret -ne 0 ]; then - return 1 - fi - ssh $_opt $_host "mv $_dir/vmcore-incomplete $_dir/vmcore.flat" || return 1 + _exitcode=$? + _vmcore="vmcore.flat" + fi + + if [ $_exitcode -eq 0 ]; then + ssh $_opt $_host "mv $_dir/vmcore-incomplete $_dir/$_vmcore" + _exitcode2=$? + if [ $_exitcode2 -ne 0 ]; then + derror "moving vmcore failed, _exitcode:$_exitcode2" + else + dinfo "saving vmcore complete" + fi + else + derror "saving vmcore failed, _exitcode:$_exitcode" + fi + + save_log + scp -q $_opt $KDUMP_LOG_FILE "$_host:$_dir/" + _ret=$? + if [ $_ret -ne 0 ]; then + derror "saving log file failed, _exitcode:$_ret" + fi + + if [ $_exitcode -ne 0 ] || [ $_exitcode2 -ne 0 ];then + return 1 fi - dinfo "saving vmcore complete" return 0 } diff --git a/kdump-lib-initramfs.sh b/kdump-lib-initramfs.sh index 791d141..e766f95 100755 --- a/kdump-lib-initramfs.sh +++ b/kdump-lib-initramfs.sh @@ -115,7 +115,7 @@ save_log() # dump_fs dump_fs() { - local ret + local _exitcode local _mp=$1 local _dev=$(get_mount_info SOURCE target $_mp -f) local _op=$(get_mount_info OPTIONS target $_mp -f) @@ -159,16 +159,20 @@ dump_fs() dinfo "saving vmcore" $CORE_COLLECTOR /proc/vmcore $_dump_path/vmcore-incomplete - ret=$? + _exitcode=$? + if [ $_exitcode -eq 0 ]; then + mv $_dump_path/vmcore-incomplete $_dump_path/vmcore + sync + dinfo "saving vmcore complete" + else + derror "saving vmcore failed, _exitcode:$_exitcode" + fi + save_log mv $KDUMP_LOG_FILE $_dump_path/ - if [ $ret -ne 0 ]; then - return 1 + if [ $_exitcode -ne 0 ]; then + return 1 fi - mv $_dump_path/vmcore-incomplete $_dump_path/vmcore - sync - - dinfo "saving vmcore complete" # improper kernel cmdline can cause the failure of echo, we can ignore this kind of failure return 0