With multiple kernel variants on the same architecture, e.g. the 4k and
64k kernel on aarch64, we can no longer assume that the crashkernel
value for the currently running kernel will work for all installed
kernels. This also means that we can no longer update the grub config as
we don't know which value to set it to. Thus get the crashkernel value
for each kernel and stop updating the grub config.
While at it merge the _new_fadump and _fadump_val variables and remove
_read_kernel_arg_in_grub_etc_default which has no user.
Signed-off-by: Philipp Rudo <prudo(a)redhat.com>
Reviewed-by: Pingfan Liu <piliu(a)redhat.com>
---
kdumpctl | 96 +++-----------------------------------------------------
1 file changed, 5 insertions(+), 91 deletions(-)
diff --git a/kdumpctl b/kdumpctl
index 113d8bc..6e4685f 100755
--- a/kdumpctl
+++ b/kdumpctl
@@ -1480,69 +1480,9 @@ _get_all_kernels_from_grubby()
echo -n "$_kernels"
}
-GRUB_ETC_DEFAULT="/etc/default/grub"
-# Update a kernel parameter in default grub conf
-#
-# If a value is specified, it will be inserted in the end. Otherwise it
-# would remove given kernel parameter.
-#
-# Note this function doesn't address the following cases,
-# 1. The kernel ignores everything on the command line after a '--'. So
-# simply adding the new entry to the end will fail if the cmdline
-# contains a --.
-# 2. If the value for a parameter contains spaces it can be quoted using
-# double quotes, for example param="value with spaces". This will
-# break the [^[:space:]\"] regex for the value.
-# 3. Dashes and underscores in the parameter name are equivalent. So
-# some_parameter and some-parameter are identical.
-# 4. Some parameters, e.g. efivar_ssdt, can be given multiple times.
-# 5. Some kernel parameters, e.g. quiet, doesn't have value
-#
-# $1: the name of the kernel command line parameter
-# $2: new value. If empty, given parameter would be removed
-_update_kernel_arg_in_grub_etc_default()
-{
- local _para=$1 _val=$2 _para_val
-
- if [[ $(uname -m) == s390x ]]; then
- return
- fi
-
- if [[ -n $_val ]]; then
- _para_val="$_para=$_val"
- fi
-
- # Update the command line /etc/default/grub, i.e.
- # on the line that starts with 'GRUB_CMDLINE_LINUX=',
- # 1) remove $para=$val if the it's the first arg
- # 2) remove all occurences of $para=$val
- # 3) insert $_para_val to end
- # 4) remove duplicate spaces left over by 1) or 2) or 3)
- # 5) remove space at the beginning of the string left over by 1) or 2) or 3)
- # 6) remove space at the end of the string left over by 1) or 2) or 3)
- sed -i -E "/^GRUB_CMDLINE_LINUX=/ {
- s/\"${_para}=[^[:space:]\"]*/\"/g;
- s/[[:space:]]+${_para}=[^[:space:]\"]*/ /g;
- s/\"$/ ${_para_val}\"/
- s/[[:space:]]+/ /g;
- s/(\")[[:space:]]+/\1/g;
- s/[[:space:]]+(\")/\1/g;
- }" "$GRUB_ETC_DEFAULT"
-}
-
-# Read the kernel arg in default grub conf.
-
-# Note reading a kernel parameter that doesn't have a value isn't supported.
-#
-# $1: the name of the kernel command line parameter
-_read_kernel_arg_in_grub_etc_default()
-{
- sed -n -E
"s/^GRUB_CMDLINE_LINUX=.*[[:space:]\"]${1}=([^[:space:]\"]*).*$/\1/p"
"$GRUB_ETC_DEFAULT"
-}
-
reset_crashkernel()
{
- local _opt _val _fadump_val _reboot _grubby_kernel_path _kernel _kernels
+ local _opt _val _reboot _grubby_kernel_path _kernel _kernels
local _dump_mode _new_dump_mode
local _has_changed _needs_reboot
local _old_ck _new_ck
@@ -1555,13 +1495,12 @@ reset_crashkernel()
derror "Option --fadump only valid on PPC"
exit 1
fi
- _val=${_opt#*=}
- if _dump_mode=$(get_dump_mode_by_fadump_val $_val); then
- _fadump_val=$_val
- else
+ _new_fadump=${_opt#*=}
+ if ! _dump_mode=$(get_dump_mode_by_fadump_val $_new_fadump); then
derror "failed to determine dump mode"
exit
fi
+ [[ "$_new_fadump" == off ]] && _new_fadump=""
;;
--kernel=*)
_val=${_opt#*=}
@@ -1598,29 +1537,6 @@ reset_crashkernel()
[[ $(uname -m) != ppc64le ]] && _dump_mode=kdump
- # If the dump mode is determined, we can also know the default crashkernel value
- if [[ -n $_dump_mode ]]; then
- _crashkernel=$(kdump_get_arch_recommend_crashkernel "$_dump_mode")
- fi
-
- # If --kernel-path=ALL, update GRUB_CMDLINE_LINUX in /etc/default/grub.
- #
- # An exception case is when the ppc64le user doesn't specify the fadump value.
- # In this case, the dump mode would be determined by parsing the kernel
- # command line of the kernel(s) to be updated thus don't update GRUB_CMDLINE_LINUX.
- #
- # The following code has been simplified because of what has been done early,
- # - set the dump mode as kdump for non-ppc64le cases
- # - retrieved the default crashkernel value for given dump mode
- if [[ $_grubby_kernel_path == ALL && -n $_dump_mode ]]; then
- _update_kernel_arg_in_grub_etc_default crashkernel "$_crashkernel"
- # remove the fadump if fadump is disabled
- if [[ $_fadump_val == off ]]; then
- _fadump_val=""
- fi
- _update_kernel_arg_in_grub_etc_default fadump "$_fadump_val"
- fi
-
# If kernel-path not specified, either
# - use KDUMP_KERNELVER if it's defined
# - use current running kernel
@@ -1638,15 +1554,13 @@ reset_crashkernel()
_has_changed=""
if [[ -z $_dump_mode ]]; then
_new_dump_mode=$(get_dump_mode_by_kernel "$_kernel")
- _new_ck=$(kdump_get_arch_recommend_crashkernel "$_new_dump_mode")
_new_fadump=$(get_grub_kernel_boot_parameter "$_kernel" fadump)
else
_new_dump_mode=$_dump_mode
- _new_ck=$_crashkernel
- _new_fadump=$_fadump_val
fi
_old_ck=$(get_grub_kernel_boot_parameter "$_kernel" crashkernel)
+ _new_ck=$(kdump_get_arch_recommend_crashkernel "$_new_dump_mode")
_old_fadump=$(get_grub_kernel_boot_parameter "$_kernel" fadump)
if _update_kernel_cmdline "$_kernel" fadump "$_old_fadump"
"$_new_fadump"; then
_has_changed="Updated fadump=$_new_fadump"
--
2.41.0