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:
parent
112d3e1891
commit
987edab69a
71
kdump-lib.sh
71
kdump-lib.sh
@ -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")
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user