Rewrite kdumpctl reset-crashkernel KERNEL_PATH as
kdumpctl reset-crashkernel [--fadump=[on|off|nocma]] [--kernel=path_to_kernel]
[--reboot]
This interface would reset a specific kernel to the default crasherknel
value given the kernel path. And it also supports grubby's syntax so
there are the following special cases,
- if --kernel not specified, current running kernel, i.e. `uname -r` is chosen
- if --kernel=DEFAULT, the default boot kernel is chosen
- if --kernel=ALL, all kernels would have its crashkernel reset to the default value
--fadump=[on|off|nocma] would be specified optionally to toggle fadump
on/off. If it's not specified, the dump mode would be determined based
on the fadump kernel cmdline parameter read from grubby and for --kernel=ALL,
all installed kernels would be iterated to tell its dump mode kernel by
kernel.
This interface will also be called by kexec-tools RPM scriptlets [1]
to reset crashkernel.
Note the support of crashkenrel.default is dropped.
[1]
https://docs.fedoraproject.org/en-US/packaging-guidelines/Scriptlets/
Signed-off-by: Coiby Xu <coxu(a)redhat.com>
---
kdumpctl | 113 +++++++++++++++++++++++++++++++++++++++++++------------
1 file changed, 89 insertions(+), 24 deletions(-)
diff --git a/kdumpctl b/kdumpctl
index 0b8dc0f..26358d2 100755
--- a/kdumpctl
+++ b/kdumpctl
@@ -1381,41 +1381,105 @@ _get_current_running_kernel_path()
fi
}
-reset_crashkernel()
+_update_grub()
{
- local kernel=$1 entry crashkernel_default
- local grub_etc_default="/etc/default/grub"
-
- [[ -z $kernel ]] && kernel=$(uname -r)
- crashkernel_default=$(cat "/usr/lib/modules/$kernel/crashkernel.default" 2>
/dev/null)
-
- if [[ -z $crashkernel_default ]]; then
- derror "$kernel doesn't have a crashkernel.default"
- exit 1
- fi
+ local _grubby_kernel_path=$1 _crashkernel=$2 _dump_mode=$3 _fadump_val=$4
if is_atomic; then
if rpm-ostree kargs | grep -q "crashkernel="; then
- rpm-ostree --replace="crashkernel=$crashkernel_default"
+ rpm-ostree --replace="crashkernel=$_crashkernel"
else
- rpm-ostree --append="crashkernel=$crashkernel_default"
+ rpm-ostree --append="crashkernel=$_crashkernel"
fi
else
- entry=$(grubby --info ALL | grep "^kernel=.*$kernel")
- entry=${entry#kernel=}
- entry=${entry#\"}
- entry=${entry%\"}
-
- if [[ -f $grub_etc_default ]]; then
- sed -i -e "s/^\(GRUB_CMDLINE_LINUX=.*\)crashkernel=[^\ \"]*\([\
\"].*\)$/\1$crashkernel_default\2/" "$grub_etc_default"
- fi
-
[[ -f /etc/zipl.conf ]] && zipl_arg="--zipl"
- grubby --args "$crashkernel_default" --update-kernel "$entry"
$zipl_arg
+ grubby --args "crashkernel=$_crashkernel" --update-kernel
"$_grubby_kernel_path" $zipl_arg
[[ $zipl_arg ]] && zipl > /dev/null
+ if [[ $_dump_mode == kdump ]]; then
+ grubby --remove-args="fadump" --update-kernel
"$_grubby_kernel_path"
+ else
+ grubby --args="fadump=$_fadump_val" --update-kernel
"$_grubby_kernel_path"
+ fi
fi
}
+_valid_grubby_kernel_path()
+{
+ grubby --info="$1" > /dev/null 2>&1
+}
+
+_get_all_kernels_from_grubby()
+{
+ local _kernels _line _kernel_path
+ for _line in $(grubby --info ALL | grep "^kernel="); do
+ _kernel_path=$(_filter_grubby_kernel_str "$_line")
+ _kernels="$_kernels $_kernel_path"
+ done
+ echo -n "$_kernels"
+}
+
+reset_crashkernel()
+{
+ local _opt _val _dump_mode _fadump_val _reboot _grubby_kernel_path _kernel_crashkernel
_kernel
+
+ for _opt in "$@"; do
+ case "$_opt" in
+ --fadump=*)
+ _val=${_opt#*=}
+ if _dump_mode=$(get_dump_mode_by_fadump_val $_val); then
+ _fadump_val=$_val
+ else
+ derror "failed to determine dump mode"
+ exit
+ fi
+ ;;
+ --kernel=*)
+ _val=${_opt#*=}
+ if ! _valid_grubby_kernel_path $_val; then
+ derror "Invalid $_opt, please specify a valid kernel path, ALL or
DEFAULT"
+ exit
+ fi
+ _grubby_kernel_path=$_val
+ ;;
+ --reboot)
+ _reboot=yes
+ ;;
+ *)
+ derror "$_opt not recognized"
+ exit 1
+ ;;
+ esac
+ done
+
+ if [[ -z $_grubby_kernel_path ]] &&
+ ! _grubby_kernel_path=$(_get_current_running_kernel_path); then
+ derror "no running kernel found"
+ exit 1
+ fi
+
+ if [[ -z $_dump_mode ]]; then
+ if [[ $_grubby_kernel_path == ALL ]]; then
+ for _kernel in $(_get_all_kernels_from_grubby); do
+ _dump_mode=$(get_dump_mode_by_kernel "$_kernel")
+ _fadump_val=$(get_grub_kernel_boot_parameter "$_kernel" fadump)
+ _update_grub "$_grubby_kernel_path" "$_kernel_crashkernel"
"$_dump_mode" "$_fadump_val"
+ done
+ [[ $_reboot == yes ]] && reboot
+ dwarn "For kernel=$_kernel, crashkernel=$_kernel_crashkernel now. Please reboot
the system to take effect."
+ return
+ else
+ _dump_mode=$(get_dump_mode_by_kernel "$_kernel")
+ _fadump_val=$(get_grub_kernel_boot_parameter "$_kernel" fadump)
+ fi
+ fi
+
+ _kernel_crashkernel=$(kdump_get_arch_recommend_crashkernel "$_dump_mode")
+ _update_grub "$_grubby_kernel_path" "$_kernel_crashkernel"
"$_dump_mode" "$_fadump_val"
+
+ [[ $_reboot == yes ]] && reboot
+ dwarn "For kernel=$_grubby_kernel_path, crashkernel=$_kernel_crashkernel now.
Please reboot the system to take effect."
+}
+
if [[ ! -f $KDUMP_CONFIG_FILE ]]; then
derror "Error: No kdump config file found!"
exit 1
@@ -1478,7 +1542,8 @@ main()
get_default_crashkernel "$2"
;;
reset-crashkernel)
- reset_crashkernel "$2"
+ shift
+ reset_crashkernel "$@"
;;
*)
dinfo $"Usage: $0
{estimate|start|stop|status|restart|reload|rebuild|reset-crashkernel|propagate|showmem}"
--
2.31.1