c5aa460992
Upstream: fedora Resolves: RHEL-32060 Conflict: Yes, there are several conflicts. 1) Upstream have moved dracut-kdump.sh into kdump-utils/dracut/99kdumpbase/kdump.sh, so the targeting files are changed. 2) There are several patchsets([1] [2]) which not backported to rhel9, so some formating conflicts encountered. But there is no functional change been made for the patch backporting. [1]: https://github.com/rhkdump/kdump-utils/pull/18/commits [2]: https://github.com/rhkdump/kdump-utils/pull/33/commits commit 88525ebf5e43cc86aea66dc75ec83db58233883b Author: Tao Liu <ltao@redhat.com> Date: Thu Sep 5 15:49:07 2024 +1200 Introduce vmcore creation notification to kdump Motivation ========== People may forget to recheck to ensure kdump works, which as a result, a possibility of no vmcores generated after a real system crash. It is unexpected for kdump. It is highly recommended people to recheck kdump after any system modification, such as: a. after kernel patching or whole yum update, as it might break something on which kdump is dependent, maybe due to introduction of any new bug etc. b. after any change at hardware level, maybe storage, networking, firmware upgrading etc. c. after implementing any new application, like which involves 3rd party modules etc. Though these exceed the range of kdump, however a simple vmcore creation status notification is good to have for now. Design ====== Kdump currently will check any relating files/fs/drivers modified before determine if initrd should rebuild when (re)start. A rebuild is an indicator of such modification, and kdump need to be rechecked. This will clear the vmcore creation status specified in $VMCORE_CREATION_STATUS. Vmcore creation check will happen at "kdumpctl (re)start/status", and will report the creation success/fail status to users. A "success" status indicates previously there has been a vmcore successfully generated based on the current env, so it is more likely a vmcore will be generated later when real crash happens; A "fail" status indicates previously there was no vmcore generated, or has been a vmcore creation failed based on current env. User should check the 2nd kernel log or the kexec-dmesg.log for the failing reason. $VMCORE_CREATION_STATUS is used for recording the vmcore creation status of the current env. The format will be like: success 1718682002 Which means, there has been a vmcore generated successfully at this timestamp for the current env. Usage ===== [root@localhost ~]# kdumpctl restart kdump: kexec: unloaded kdump kernel kdump: Stopping kdump: [OK] kdump: kexec: loaded kdump kernel kdump: Starting kdump: [OK] kdump: Notice: No vmcore creation test performed! [root@localhost ~]# kdumpctl test [root@localhost ~]# kdumpctl status kdump: Kdump is operational kdump: Notice: Last successful vmcore creation on Tue Jun 18 16:39:10 CST 2024 [root@localhost ~]# kdumpctl restart kdump: kexec: unloaded kdump kernel kdump: Stopping kdump: [OK] kdump: kexec: loaded kdump kernel kdump: Starting kdump: [OK] kdump: Notice: Last successful vmcore creation on Tue Jun 18 16:39:10 CST 2024 The notification for kdumpctl (re)start/status can be disabled by setting VMCORE_CREATION_NOTIFICATION in /etc/sysconfig/kdump Signed-off-by: Tao Liu <ltao@redhat.com> Signed-off-by: Tao Liu <ltao@redhat.com>
211 lines
4.6 KiB
Bash
Executable File
211 lines
4.6 KiB
Bash
Executable File
#!/bin/sh
|
|
#
|
|
# The code in this file will be used in initramfs environment, bash may
|
|
# not be the default shell. Any code added must be POSIX compliant.
|
|
|
|
DEFAULT_PATH="/var/crash/"
|
|
KDUMP_CONFIG_FILE="/etc/kdump.conf"
|
|
FENCE_KDUMP_CONFIG_FILE="/etc/sysconfig/fence_kdump"
|
|
FENCE_KDUMP_SEND="/usr/libexec/fence_kdump_send"
|
|
LVM_CONF="/etc/lvm/lvm.conf"
|
|
VMCORE_CREATION_STATUS="/var/crash/vmcore-creation.status"
|
|
|
|
# Read kdump config in well formated style
|
|
kdump_read_conf()
|
|
{
|
|
# Following steps are applied in order: strip trailing comment, strip trailing space,
|
|
# strip heading space, match non-empty line, remove duplicated spaces between conf name and value
|
|
[ -f "$KDUMP_CONFIG_FILE" ] && sed -n -e "s/#.*//;s/\s*$//;s/^\s*//;s/\(\S\+\)\s*\(.*\)/\1 \2/p" $KDUMP_CONFIG_FILE
|
|
}
|
|
|
|
# Retrieves config value defined in kdump.conf
|
|
# $1: config name, sed regexp compatible
|
|
kdump_get_conf_val()
|
|
{
|
|
# For lines matching "^\s*$1\s+", remove matched part (config name including space),
|
|
# remove tailing comment, space, then store in hold space. Print out the hold buffer on last line.
|
|
[ -f "$KDUMP_CONFIG_FILE" ] &&
|
|
sed -n -e "/^\s*\($1\)\s\+/{s/^\s*\($1\)\s\+//;s/#.*//;s/\s*$//;h};\${x;p}" $KDUMP_CONFIG_FILE
|
|
}
|
|
|
|
is_mounted()
|
|
{
|
|
findmnt -k -n "$1" > /dev/null 2>&1
|
|
}
|
|
|
|
# $1: info type
|
|
# $2: mount source type
|
|
# $3: mount source
|
|
# $4: extra args
|
|
get_mount_info()
|
|
{
|
|
__kdump_mnt=$(findmnt -k -n -r -o "$1" "--$2" "$3" $4)
|
|
|
|
[ -z "$__kdump_mnt" ] && [ -e "/etc/fstab" ] && __kdump_mnt=$(findmnt -s -n -r -o "$1" "--$2" "$3" $4)
|
|
|
|
echo "$__kdump_mnt"
|
|
}
|
|
|
|
is_ipv6_address()
|
|
{
|
|
echo "$1" | grep -q ":"
|
|
}
|
|
|
|
is_fs_type_nfs()
|
|
{
|
|
[ "$1" = "nfs" ] || [ "$1" = "nfs4" ]
|
|
}
|
|
|
|
is_fs_type_virtiofs()
|
|
{
|
|
[ "$1" = "virtiofs" ]
|
|
}
|
|
|
|
# If $1 contains dracut_args "--mount", return <filesystem type>
|
|
get_dracut_args_fstype()
|
|
{
|
|
echo $1 | grep "\-\-mount" | sed "s/.*--mount .\(.*\)/\1/" | cut -d' ' -f3
|
|
}
|
|
|
|
# If $1 contains dracut_args "--mount", return <device>
|
|
get_dracut_args_target()
|
|
{
|
|
echo $1 | grep "\-\-mount" | sed "s/.*--mount .\(.*\)/\1/" | cut -d' ' -f1
|
|
}
|
|
|
|
get_save_path()
|
|
{
|
|
__kdump_path=$(kdump_get_conf_val path)
|
|
[ -z "$__kdump_path" ] && __kdump_path=$DEFAULT_PATH
|
|
|
|
# strip the duplicated "/"
|
|
echo "$__kdump_path" | tr -s /
|
|
}
|
|
|
|
get_root_fs_device()
|
|
{
|
|
findmnt -k -f -n -o SOURCE /
|
|
}
|
|
|
|
# Return the current underlying device of a path, ignore bind mounts
|
|
get_target_from_path()
|
|
{
|
|
__kdump_target=$(df "$1" 2> /dev/null | tail -1 | awk '{print $1}')
|
|
[ "$__kdump_target" = "/dev/root" ] && [ ! -e /dev/root ] && __kdump_target=$(get_root_fs_device)
|
|
echo "$__kdump_target"
|
|
}
|
|
|
|
get_fs_type_from_target()
|
|
{
|
|
get_mount_info FSTYPE source "$1" -f
|
|
}
|
|
|
|
get_mntpoint_from_target()
|
|
{
|
|
# --source is applied to ensure non-bind mount is returned
|
|
get_mount_info TARGET source "$1" -f
|
|
}
|
|
|
|
is_ssh_dump_target()
|
|
{
|
|
kdump_get_conf_val ssh | grep -q @
|
|
}
|
|
|
|
is_raw_dump_target()
|
|
{
|
|
[ -n "$(kdump_get_conf_val raw)" ]
|
|
}
|
|
|
|
is_virtiofs_dump_target()
|
|
{
|
|
if [ -n "$(kdump_get_conf_val virtiofs)" ]; then
|
|
return 0
|
|
fi
|
|
|
|
if is_fs_type_virtiofs "$(get_dracut_args_fstype "$(kdump_get_conf_val dracut_args)")"; then
|
|
return 0
|
|
fi
|
|
|
|
if is_fs_type_virtiofs "$(get_fs_type_from_target "$(get_target_from_path "$(get_save_path)")")"; then
|
|
return 0
|
|
fi
|
|
|
|
return 1
|
|
}
|
|
|
|
is_nfs_dump_target()
|
|
{
|
|
if [ -n "$(kdump_get_conf_val nfs)" ]; then
|
|
return 0
|
|
fi
|
|
|
|
if is_fs_type_nfs "$(get_dracut_args_fstype "$(kdump_get_conf_val dracut_args)")"; then
|
|
return 0
|
|
fi
|
|
|
|
if is_fs_type_nfs "$(get_fs_type_from_target "$(get_target_from_path "$(get_save_path)")")"; then
|
|
return 0
|
|
fi
|
|
|
|
return 1
|
|
}
|
|
|
|
is_fs_dump_target()
|
|
{
|
|
[ -n "$(kdump_get_conf_val "ext[234]\|xfs\|btrfs\|minix\|virtiofs")" ]
|
|
}
|
|
|
|
is_lvm2_thinp_device()
|
|
{
|
|
_device_path=$1
|
|
_lvm2_thin_device=$(lvm lvs -S 'lv_layout=sparse && lv_layout=thin' \
|
|
--nosuffix --noheadings -o vg_name,lv_name "$_device_path" 2> /dev/null)
|
|
|
|
[ -n "$_lvm2_thin_device" ]
|
|
}
|
|
|
|
kdump_get_ip_route()
|
|
{
|
|
if ! _route=$(/sbin/ip -o route get to "$1" 2>&1); then
|
|
exit 1
|
|
fi
|
|
echo "$_route"
|
|
}
|
|
|
|
kdump_get_ip_route_field()
|
|
{
|
|
echo "$1" | sed -n -e "s/^.*\<$2\>\s\+\(\S\+\).*$/\1/p"
|
|
}
|
|
|
|
# $1: success/fail/clear
|
|
# $2: status_file
|
|
set_vmcore_creation_status()
|
|
{
|
|
_status=$1
|
|
_status_file=$2
|
|
_dir=$(dirname "$_status_file")
|
|
|
|
[[ -d "$_dir" ]] || mkdir -p "$_dir"
|
|
|
|
_mnt_op=$(get_mount_info OPTIONS target "$_dir" -f)
|
|
case $_mnt_op in
|
|
ro*)
|
|
dinfo "remounting the vmcore status target in rw mode."
|
|
mount -o remount,rw "$(findmnt -n -o TARGET --target $_dir)"
|
|
;;
|
|
esac
|
|
|
|
case "$_status" in
|
|
success | fail)
|
|
dinfo "saving vmcore status file to $_status_file"
|
|
echo "$_status $(date +%s)" > "$_status_file"
|
|
;;
|
|
clear)
|
|
rm -f "$_status_file"
|
|
;;
|
|
*)
|
|
return
|
|
esac
|
|
sync -f "$_dir"
|
|
}
|