kdump-lib: use non-debug kernels first

Resolves: bz2076425
Upstream: Fedora
Conflict: None

commit c5bdd2d8f1
Author: Lichen Liu <lichliu@redhat.com>
Date:   Mon Jun 13 12:08:08 2022 +0800

    kdump-lib: use non-debug kernels first

    Kdump uses currently running kernel as default, but when currently
    running kernel is a debug kernel, it will consume more memory,
    which may cause out-of-memory and fail to collect vmcore.

    Now we will try to use non-debug kernels first if possible.

    Also extract the logic of determine KDUMP_KERNEL from
    prepare_kdump_bootinfo into a function. This function will return
    KDUMP_KERNEL given a kernel version.

    Signed-off-by: Lichen Liu <lichliu@redhat.com>
    Acked-by: Coiby Xu <coxu@redhat.com>

Signed-off-by: Lichen Liu <lichliu@redhat.com>
This commit is contained in:
Lichen Liu 2022-06-17 10:58:19 +08:00
parent 112d3e1891
commit 987edab69a

View File

@ -630,8 +630,36 @@ prepare_kexec_args()
echo "$kexec_args" echo "$kexec_args"
} }
# prepare_kdump_kernel <kdump_kernelver>
# This function return kdump_kernel given a kernel version.
prepare_kdump_kernel()
{
local kdump_kernelver=$1
local dir img boot_dirlist boot_imglist kdump_kernel machine_id
read -r machine_id < /etc/machine-id
boot_dirlist=${KDUMP_BOOTDIR:-"/boot /boot/efi /efi /"}
boot_imglist="$KDUMP_IMG-$kdump_kernelver$KDUMP_IMG_EXT $machine_id/$kdump_kernelver/$KDUMP_IMG"
# Use BOOT_IMAGE as reference if possible, strip the GRUB root device prefix in (hd0,gpt1) format
boot_img="$(sed "s/^BOOT_IMAGE=\((\S*)\)\?\(\S*\) .*/\2/" /proc/cmdline)"
if [[ "$boot_img" == *"$kdump_kernelver" ]]; then
boot_imglist="$boot_img $boot_imglist"
fi
for dir in $boot_dirlist; do
for img in $boot_imglist; do
if [[ -f "$dir/$img" ]]; then
kdump_kernel=$(echo "$dir/$img" | tr -s '/')
break 2
fi
done
done
echo "$kdump_kernel"
}
# #
# Detect initrd and kernel location, results are stored in global enviromental variables: # Detect initrd and kernel location, results are stored in global environmental variables:
# KDUMP_BOOTDIR, KDUMP_KERNELVER, KDUMP_KERNEL, DEFAULT_INITRD, and KDUMP_INITRD # KDUMP_BOOTDIR, KDUMP_KERNELVER, KDUMP_KERNEL, DEFAULT_INITRD, and KDUMP_INITRD
# #
# Expectes KDUMP_BOOTDIR, KDUMP_IMG, KDUMP_IMG_EXT, KDUMP_KERNELVER to be loaded from config already # Expectes KDUMP_BOOTDIR, KDUMP_IMG, KDUMP_IMG_EXT, KDUMP_KERNELVER to be loaded from config already
@ -639,37 +667,40 @@ prepare_kexec_args()
# #
prepare_kdump_bootinfo() prepare_kdump_bootinfo()
{ {
local boot_img boot_imglist boot_dirlist boot_initrdlist local boot_initrdlist nondebug_kernelver debug_kernelver
local machine_id dir img default_initrd_base var_target_initrd_dir local default_initrd_base var_target_initrd_dir
if [[ -z $KDUMP_KERNELVER ]]; then if [[ -z $KDUMP_KERNELVER ]]; then
KDUMP_KERNELVER="$(uname -r)" KDUMP_KERNELVER=$(uname -r)
nondebug_kernelver=$(sed -n -e 's/\(.*\)+debug$/\1/p' <<< "$KDUMP_KERNELVER")
fi fi
read -r machine_id < /etc/machine-id # Use nondebug kernel if possible, because debug kernel will consume more memory and may oom.
boot_dirlist=${KDUMP_BOOTDIR:-"/boot /boot/efi /efi /"} if [[ -n $nondebug_kernelver ]]; then
boot_imglist="$KDUMP_IMG-$KDUMP_KERNELVER$KDUMP_IMG_EXT $machine_id/$KDUMP_KERNELVER/$KDUMP_IMG" dinfo "Trying to use $nondebug_kernelver."
debug_kernelver=$KDUMP_KERNELVER
# Use BOOT_IMAGE as reference if possible, strip the GRUB root device prefix in (hd0,gpt1) format KDUMP_KERNELVER=$nondebug_kernelver
boot_img="$(sed "s/^BOOT_IMAGE=\((\S*)\)\?\(\S*\) .*/\2/" /proc/cmdline)"
if [[ -n $boot_img ]]; then
boot_imglist="$boot_img $boot_imglist"
fi fi
for dir in $boot_dirlist; do KDUMP_KERNEL=$(prepare_kdump_kernel "$KDUMP_KERNELVER")
for img in $boot_imglist; do
if [[ -f "$dir/$img" ]]; then if ! [[ -e $KDUMP_KERNEL ]]; then
KDUMP_KERNEL=$(echo "$dir/$img" | tr -s '/') if [[ -n $debug_kernelver ]]; then
break 2 dinfo "Fallback to using debug kernel"
fi KDUMP_KERNELVER=$debug_kernelver
done KDUMP_KERNEL=$(prepare_kdump_kernel "$KDUMP_KERNELVER")
done fi
fi
if ! [[ -e $KDUMP_KERNEL ]]; then if ! [[ -e $KDUMP_KERNEL ]]; then
derror "Failed to detect kdump kernel location" derror "Failed to detect kdump kernel location"
return 1 return 1
fi fi
if [[ "$KDUMP_KERNEL" == *"+debug" ]]; then
dwarn "Using debug kernel, you may need to set a larger crashkernel than the default value."
fi
# Set KDUMP_BOOTDIR to where kernel image is stored # Set KDUMP_BOOTDIR to where kernel image is stored
KDUMP_BOOTDIR=$(dirname "$KDUMP_KERNEL") KDUMP_BOOTDIR=$(dirname "$KDUMP_KERNEL")