[PATCH] Add code comments to help better understanding
by Lianbo Jiang
Let's add some code comments to help better understanding, and
no code changes.
Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
---
dracut-early-kdump.sh | 3 +++
kdumpctl | 4 ++++
2 files changed, 7 insertions(+)
diff --git a/dracut-early-kdump.sh b/dracut-early-kdump.sh
index 23bb369a0c13..a4e14a46bf75 100755
--- a/dracut-early-kdump.sh
+++ b/dracut-early-kdump.sh
@@ -53,6 +53,9 @@ early_kdump_load()
EARLY_KEXEC_ARGS="$EARLY_KEXEC_ARGS -s"
fi
+ # Here, only output the messages, but do not save these messages
+ # to a file because the target disk may not be mounted yet, the
+ # earlykdump is too early.
ddebug "earlykdump: $KEXEC ${EARLY_KEXEC_ARGS} $standard_kexec_args \
--command-line=$EARLY_KDUMP_CMDLINE --initrd=$EARLY_KDUMP_INITRD \
$EARLY_KDUMP_KERNEL"
diff --git a/kdumpctl b/kdumpctl
index e81671987c9b..94e4f5a1c020 100755
--- a/kdumpctl
+++ b/kdumpctl
@@ -719,6 +719,10 @@ load_kdump()
ddebug "$KEXEC $KEXEC_ARGS $standard_kexec_args --command-line=$KDUMP_COMMANDLINE --initrd=$TARGET_INITRD $KDUMP_KERNEL"
+ # The '12' represents an intermediate temporary file descriptor
+ # to store the standard error file descriptor '2', and later
+ # restore the error file descriptor with the file descriptor '12'
+ # and release it.
exec 12>&2
exec 2>> $KDUMP_LOG_PATH/kdump.log
PS4='+ $(date "+%Y-%m-%d %H:%M:%S") ${BASH_SOURCE}@${LINENO}: '
--
2.17.1
3 years, 4 months
[PATCH 0/3] Improve dracut module install code
by Kairui Song
Now all dracut module dependency install code are in one place in
module-setup.sh, and allows user to omit non-mandatory modules.
For example, squash module could be omitted by using:
dracut_args --omit squash
Kairui Song (3):
Move some dracut module dependencies checks to module-setup.sh
Add a helper to omit non-mandatory dracut module
Move watchdog detect and install code to module-setup.sh
dracut-module-setup.sh | 21 ++++++++++++++++++---
kdump-lib.sh | 12 ++++++++++++
mkdumprd | 27 ---------------------------
3 files changed, 30 insertions(+), 30 deletions(-)
--
2.28.0
3 years, 4 months
[PATCH v2] Remove unused log level and update kdump sysconfig
by Lianbo Jiang
Previously, the range of log level is from 1 to 6, and the TRACE
level and FATAL level are not used, therefore, let's remove these
unused log levels and update the kdump sysconfig accordingly.
Nowadays it has only four log levels: error(1), warn(2), info(3)
and debug(4). We have to remap the numeric log level to the logger
priority or syslog log level, which is finished in kdump-logger.sh
module, it is invisible for user.
In addition, kdump uses the different options to control the log
levels for the first kernel and the second kernel.
Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
---
dracut-module-setup.sh | 5 +-
kdump-lib-initramfs.sh | 1 -
kdump-logger.sh | 206 +++++++++++++++++-----------------------
kdump.sysconfig | 21 ++--
kdump.sysconfig.aarch64 | 21 ++--
kdump.sysconfig.i386 | 21 ++--
kdump.sysconfig.ppc64 | 21 ++--
kdump.sysconfig.ppc64le | 21 ++--
kdump.sysconfig.s390x | 21 ++--
kdump.sysconfig.x86_64 | 21 ++--
10 files changed, 157 insertions(+), 202 deletions(-)
diff --git a/dracut-module-setup.sh b/dracut-module-setup.sh
index 911a8b84de9d..e8d7c46cc407 100755
--- a/dracut-module-setup.sh
+++ b/dracut-module-setup.sh
@@ -33,7 +33,7 @@ depends() {
if is_squash_available && ! is_fadump_capable; then
_dep="$_dep squash"
else
- dwarning "Required modules to build a squashed kdump image is missing!"
+ dwarn "Required modules to build a squashed kdump image is missing!"
fi
if [ -n "$( find /sys/devices -name drm )" ] || [ -d /sys/module/hyperv_fb ]; then
@@ -72,7 +72,7 @@ source_ifcfg_file() {
if [ -f "${ifcfg_file}" ]; then
. ${ifcfg_file}
else
- dwarning "The ifcfg file of $1 is not found!"
+ dwarn "The ifcfg file of $1 is not found!"
fi
}
@@ -819,7 +819,6 @@ install() {
kdump_install_random_seed
fi
dracut_install -o /etc/adjtime /etc/localtime
- inst_simple "/etc/sysconfig/kdump"
inst "$moddir/monitor_dd_progress" "/kdumpscripts/monitor_dd_progress"
chmod +x ${initdir}/kdumpscripts/monitor_dd_progress
inst "/bin/dd" "/bin/dd"
diff --git a/kdump-lib-initramfs.sh b/kdump-lib-initramfs.sh
index 14aac7b98d44..d8d48935b32e 100755
--- a/kdump-lib-initramfs.sh
+++ b/kdump-lib-initramfs.sh
@@ -1,6 +1,5 @@
# These variables and functions are useful in 2nd kernel
-. /etc/sysconfig/kdump
. /lib/kdump-lib.sh
KDUMP_PATH="/var/crash"
diff --git a/kdump-logger.sh b/kdump-logger.sh
index a3d674cd07c2..fedcc4b6d3c6 100755
--- a/kdump-logger.sh
+++ b/kdump-logger.sh
@@ -2,39 +2,58 @@
#
# This comes from the dracut-logger.sh
#
-# The logger defined 6 logging levels:
-# - dtrace() (6)
-# The TRACE Level designates finer-grained informational events than the
-# DEBUG.
-# - ddebug (5)
+# The logger defined 4 logging levels:
+# - ddebug (4)
# The DEBUG Level designates fine-grained informational events that are most
# useful to debug an application.
-# - dinfo (4)
+# - dinfo (3)
# The INFO level designates informational messages that highlight the
# progress of the application at coarse-grained level.
-# - dwarn (3)
+# - dwarn (2)
# The WARN level designates potentially harmful situations.
-# - derror (2)
+# - derror (1)
# The ERROR level designates error events that might still allow the
# application to continue running.
-# - dfatal (1)
-# The FATAL level designates very severe error events that will presumably
-# lead the application to abort.
#
# Logging is controlled by following global variables:
# - @var kdump_stdloglvl - logging level to standard error (console output)
# - @var kdump_sysloglvl - logging level to syslog (by logger command)
# - @var kdump_kmsgloglvl - logging level to /dev/kmsg (only for boot-time)
#
-# If any of the variables is not set, this function set it to default:
-# - @var kdump_stdloglvl = 4 (info)
-# - @var kdump_sysloglvl = 4 (info)
-# - @var kdump_kmsgloglvl = 0 (no logging)
+# If any of the variables is not set, the function dlog_init() sets it to default:
+# - In the first kernel:
+# - @var kdump_stdloglvl = 3 (info)
+# - @var kdump_sysloglvl = 3 (info)
+# - @var kdump_kmsgloglvl = 0 (no logging)
+#
+# -In the second kernel:
+# - @var kdump_stdloglvl = 0 (no logging)
+# - @var kdump_sysloglvl = 3 (info)
+# - @var kdump_kmsgloglvl = 0 (no logging)
#
# First of all you have to start with dlog_init() function which initializes
# required variables. Don't call any other logging function before that one!
#
+if [ -f /lib/dracut-lib.sh ]; then
+ . /lib/dracut-lib.sh
+fi
+
+# @brief Get the log level from kernel command line.
+# @retval 1 if something has gone wrong
+# @retval 0 on success.
+#
+get_kdump_loglvl()
+{
+ (type -p getarg) && kdump_sysloglvl=$(getarg rd.kdumploglvl)
+ [ -z "$kdump_sysloglvl" ] && return 1;
+
+ (type -p isdigit) && isdigit $kdump_sysloglvl
+ [ $? -ne 0 ] && return 1;
+
+ return 0
+}
+
# @brief Check the log level.
# @retval 1 if something has gone wrong
# @retval 0 on success.
@@ -42,7 +61,7 @@
check_loglvl()
{
case "$1" in
- 0|1|2|3|4|5|6)
+ 0|1|2|3|4)
return 0
;;
*)
@@ -58,8 +77,19 @@ check_loglvl()
dlog_init() {
local ret=0; local errmsg
- [ -z "$kdump_stdloglvl" ] && kdump_stdloglvl=4
- [ -z "$kdump_sysloglvl" ] && kdump_sysloglvl=4
+ if [ -s /proc/vmcore ];then
+ get_kdump_loglvl
+ if [ $? -ne 0 ];then
+ logger -t "kdump[$$]" -p error -- "Fail to set rd.kdumploglvl option in kernel command line."
+ logger -t "kdump[$$]" -p warn -- "Kdump is using the default log level(3)."
+ kdump_sysloglvl=3
+ fi
+ kdump_stdloglvl=0
+ kdump_kmsgloglvl=0
+ fi
+
+ [ -z "$kdump_stdloglvl" ] && kdump_stdloglvl=3
+ [ -z "$kdump_sysloglvl" ] && kdump_sysloglvl=3
[ -z "$kdump_kmsgloglvl" ] && kdump_kmsgloglvl=0
for loglvl in $kdump_stdloglvl $kdump_kmsgloglvl $kdump_sysloglvl; do
@@ -103,83 +133,50 @@ dlog_init() {
readonly kdump_maxloglvl=$maxloglvl_l
export kdump_maxloglvl
-
- if [[ $kdump_stdloglvl -lt 6 ]] && [[ $kdump_kmsgloglvl -lt 6 ]] && [[ $kdump_sysloglvl -lt 6 ]]; then
- unset dtrace
- dtrace() { :; };
- fi
-
- if [[ $kdump_stdloglvl -lt 5 ]] && [[ $kdump_kmsgloglvl -lt 5 ]] && [[ $kdump_sysloglvl -lt 5 ]]; then
+ if [[ $kdump_stdloglvl -lt 4 ]] && [[ $kdump_kmsgloglvl -lt 4 ]] && [[ $kdump_sysloglvl -lt 4 ]]; then
unset ddebug
ddebug() { :; };
fi
- if [[ $kdump_stdloglvl -lt 4 ]] && [[ $kdump_kmsgloglvl -lt 4 ]] && [[ $kdump_sysloglvl -lt 4 ]]; then
+ if [[ $kdump_stdloglvl -lt 3 ]] && [[ $kdump_kmsgloglvl -lt 3 ]] && [[ $kdump_sysloglvl -lt 3 ]]; then
unset dinfo
dinfo() { :; };
fi
- if [[ $kdump_stdloglvl -lt 3 ]] && [[ $kdump_kmsgloglvl -lt 3 ]] && [[ $kdump_sysloglvl -lt 3 ]]; then
+ if [[ $kdump_stdloglvl -lt 2 ]] && [[ $kdump_kmsgloglvl -lt 2 ]] && [[ $kdump_sysloglvl -lt 2 ]]; then
unset dwarn
dwarn() { :; };
- unset dwarning
- dwarning() { :; };
fi
- if [[ $kdump_stdloglvl -lt 2 ]] && [[ $kdump_kmsgloglvl -lt 2 ]] && [[ $kdump_sysloglvl -lt 2 ]]; then
+ if [[ $kdump_stdloglvl -lt 1 ]] && [[ $kdump_kmsgloglvl -lt 1 ]] && [[ $kdump_sysloglvl -lt 1 ]]; then
unset derror
derror() { :; };
fi
- if [[ $kdump_stdloglvl -lt 1 ]] && [[ $kdump_kmsgloglvl -lt 1 ]] && [[ $kdump_sysloglvl -lt 1 ]]; then
- unset dfatal
- dfatal() { :; };
- fi
-
[ -n "$errmsg" ] && derror "$errmsg"
return $ret
}
-## @brief Converts numeric logging level to the first letter of level name.
-#
-# @param lvl Numeric logging level in range from 1 to 6.
-# @retval 1 if @a lvl is out of range.
-# @retval 0 if @a lvl is correct.
-# @result Echoes first letter of level name.
-_lvl2char() {
- case "$1" in
- 1) echo F;;
- 2) echo E;;
- 3) echo W;;
- 4) echo I;;
- 5) echo D;;
- 6) echo T;;
- *) return 1;;
- esac
-}
-
## @brief Converts numeric level to logger priority defined by POSIX.2.
#
-# @param lvl Numeric logging level in range from 1 to 6.
+# @param lvl Numeric logging level in range from 1 to 4.
# @retval 1 if @a lvl is out of range.
# @retval 0 if @a lvl is correct.
# @result Echoes logger priority.
_lvl2syspri() {
case "$1" in
- 1) echo crit;;
- 2) echo error;;
- 3) echo warning;;
- 4) echo info;;
- 5) echo debug;;
- 6) echo debug;;
+ 1) echo error;;
+ 2) echo warning;;
+ 3) echo info;;
+ 4) echo debug;;
*) return 1;;
esac
}
## @brief Converts logger numeric level to syslog log level
#
-# @param lvl Numeric logging level in range from 1 to 6.
+# @param lvl Numeric logging level in range from 1 to 4.
# @retval 1 if @a lvl is out of range.
# @retval 0 if @a lvl is correct.
# @result Echoes kernel console numeric log level
@@ -189,13 +186,12 @@ _lvl2syspri() {
# <tt>
# none -> LOG_EMERG (0)
# none -> LOG_ALERT (1)
-# FATAL(1) -> LOG_CRIT (2)
-# ERROR(2) -> LOG_ERR (3)
-# WARN(3) -> LOG_WARNING (4)
+# none -> LOG_CRIT (2)
+# ERROR(1) -> LOG_ERR (3)
+# WARN(2) -> LOG_WARNING (4)
# none -> LOG_NOTICE (5)
-# INFO(4) -> LOG_INFO (6)
-# DEBUG(5) -> LOG_DEBUG (7)
-# TRACE(6) /
+# INFO(3) -> LOG_INFO (6)
+# DEBUG(4) -> LOG_DEBUG (7)
# </tt>
#
# @see /usr/include/sys/syslog.h
@@ -203,30 +199,31 @@ _dlvl2syslvl() {
local lvl
case "$1" in
- 1) lvl=2;;
- 2) lvl=3;;
- 3) lvl=4;;
- 4) lvl=6;;
- 5) lvl=7;;
- 6) lvl=7;;
+ 1) lvl=3;;
+ 2) lvl=4;;
+ 3) lvl=6;;
+ 4) lvl=7;;
*) return 1;;
esac
- [ -s /proc/vmcore ] && echo $((24+$lvl)) || echo $((8+$lvl))
+ # The number is constructed by multiplying the facility by 8 and then
+ # adding the level.
+ # About The Syslog Protocol, please refer to the RFC5424 for more details.
+ echo $((24+$lvl))
}
-## @brief Prints to stderr and/or writes to file, to syslog and/or /dev/kmsg
-# given message with given level (priority).
+## @brief Prints to stderr, to syslog and/or /dev/kmsg given message with
+# given level (priority).
#
# @param lvl Numeric logging level.
# @param msg Message.
# @retval 0 It's always returned, even if logging failed.
#
# @note This function is not supposed to be called manually. Please use
-# dtrace(), ddebug(), or others instead which wrap this one.
+# dinfo(), ddebug(), or others instead which wrap this one.
#
-# This is core logging function which logs given message to standard error, file
-# and/or syslog (with POSIX shell command <tt>logger</tt>) and/or to /dev/kmsg.
+# This is core logging function which logs given message to standard error
+# and syslog (with POSIX shell command <tt>logger</tt>) and/or to /dev/kmsg.
# The format is following:
#
# <tt>X: some message</tt>
@@ -236,16 +233,13 @@ _dlvl2syslvl() {
#
# Message to syslog is sent with tag @c kdump. Priorities are mapped as
# following:
-# - @c FATAL to @c crit
# - @c ERROR to @c error
# - @c WARN to @c warning
# - @c INFO to @c info
-# - @c DEBUG and @c TRACE both to @c debug
+# - @c DEBUG to @c debug
_do_dlog() {
local lvl="$1"; shift
- local lvlc=$(_lvl2char "$lvl") || return 0
local msg="$*"
- local lmsg="$lvlc: $*"
[[ $lvl -le $kdump_stdloglvl ]] && printf -- 'kdump: %s\n' "$msg" >&2
@@ -268,7 +262,7 @@ _do_dlog() {
# @retval 0 It's always returned, even if logging failed.
#
# @note This function is not supposed to be called manually. Please use
-# dtrace(), ddebug(), or others instead which wrap this one.
+# dinfo(), ddebug(), or others instead which wrap this one.
#
# This function calls _do_dlog() either with parameter msg, or if
# none is given, it will read standard input and will use every line as
@@ -290,71 +284,41 @@ dlog() {
fi
}
-## @brief Logs message at TRACE level (6)
-#
-# @param msg Message.
-# @retval 0 It's always returned, even if logging failed.
-dtrace() {
- set +x
- dlog 6 "$@"
- [ -n "$debug" ] && set -x || :
-}
-
-## @brief Logs message at DEBUG level (5)
+## @brief Logs message at DEBUG level (4)
#
# @param msg Message.
# @retval 0 It's always returned, even if logging failed.
ddebug() {
- set +x
- dlog 5 "$@"
- [ -n "$debug" ] && set -x || :
-}
-
-## @brief Logs message at INFO level (4)
-#
-# @param msg Message.
-# @retval 0 It's always returned, even if logging failed.
-dinfo() {
set +x
dlog 4 "$@"
[ -n "$debug" ] && set -x || :
}
-## @brief Logs message at WARN level (3)
+## @brief Logs message at INFO level (3)
#
# @param msg Message.
# @retval 0 It's always returned, even if logging failed.
-dwarn() {
+dinfo() {
set +x
dlog 3 "$@"
[ -n "$debug" ] && set -x || :
}
-## @brief It's an alias to dwarn() function.
+## @brief Logs message at WARN level (2)
#
# @param msg Message.
# @retval 0 It's always returned, even if logging failed.
-dwarning() {
- set +x
- dwarn "$@"
- [ -n "$debug" ] && set -x || :
-}
-
-## @brief Logs message at ERROR level (2)
-#
-# @param msg Message.
-# @retval 0 It's always returned, even if logging failed.
-derror() {
+dwarn() {
set +x
dlog 2 "$@"
[ -n "$debug" ] && set -x || :
}
-## @brief Logs message at FATAL level (1)
+## @brief Logs message at ERROR level (1)
#
# @param msg Message.
# @retval 0 It's always returned, even if logging failed.
-dfatal() {
+derror() {
set +x
dlog 1 "$@"
[ -n "$debug" ] && set -x || :
diff --git a/kdump.sysconfig b/kdump.sysconfig
index 52a0b9249fe7..d6b54ef489c0 100644
--- a/kdump.sysconfig
+++ b/kdump.sysconfig
@@ -21,7 +21,7 @@ KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet log_buf_len swio
# This variable lets us append arguments to the current kdump commandline
# after processed by KDUMP_COMMANDLINE_REMOVE
-KDUMP_COMMANDLINE_APPEND="irqpoll maxcpus=1 reset_devices novmcoredd"
+KDUMP_COMMANDLINE_APPEND="irqpoll maxcpus=1 reset_devices novmcoredd rd.kdumploglvl=3"
# Any additional kexec arguments required. In most situations, this should
# be left empty
@@ -36,18 +36,17 @@ KEXEC_ARGS=""
#What is the image type used for kdump
KDUMP_IMG="vmlinuz"
-# Logging is controlled by following global variables:
+# Logging is controlled by following global variables in the first kernel:
# - @var kdump_stdloglvl - logging level to standard error (console output)
# - @var kdump_sysloglvl - logging level to syslog (by logger command)
# - @var kdump_kmsgloglvl - logging level to /dev/kmsg (only for boot-time)
-# If any of the variables is not set, this function set it to default:
-# - @var kdump_stdloglvl=4 (info)
-# - @var kdump_sysloglvl=4 (info)
-# - @var kdump_kmsgloglvl=0 (no logging)
#
-# Logging levels: fatal(1),error(2),warn(3),info(4),debug(5),trace(6)
+# In the second kernel, kdump will use the rd.kdumploglvl option to set the
+# log level in the above KDUMP_COMMANDLINE_APPEND.
+# - @var rd.kdumploglvl - logging level to syslog (by logger command)
#
-# For example: the following configurations indicate that kdump messages will be printed
-# to console and journald for debugging case.
-# kdump_sysloglvl=5
-# kdump_stdloglvl=5
+# Logging levels: no logging(0), error(1),warn(2),info(3),debug(4)
+#
+kdump_stdloglvl=3
+kdump_sysloglvl=3
+kdump_kmsgloglvl=0
diff --git a/kdump.sysconfig.aarch64 b/kdump.sysconfig.aarch64
index 1d75979df03e..f869e0e7e93d 100644
--- a/kdump.sysconfig.aarch64
+++ b/kdump.sysconfig.aarch64
@@ -21,7 +21,7 @@ KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet log_buf_len swio
# This variable lets us append arguments to the current kdump commandline
# after processed by KDUMP_COMMANDLINE_REMOVE
-KDUMP_COMMANDLINE_APPEND="irqpoll nr_cpus=1 reset_devices cgroup_disable=memory udev.children-max=2 panic=10 swiotlb=noforce novmcoredd"
+KDUMP_COMMANDLINE_APPEND="irqpoll nr_cpus=1 reset_devices cgroup_disable=memory udev.children-max=2 panic=10 swiotlb=noforce novmcoredd rd.kdumploglvl=3"
# Any additional kexec arguments required. In most situations, this should
# be left empty
@@ -36,18 +36,17 @@ KEXEC_ARGS=""
#What is the image type used for kdump
KDUMP_IMG="vmlinuz"
-# Logging is controlled by following global variables:
+# Logging is controlled by following global variables in the first kernel:
# - @var kdump_stdloglvl - logging level to standard error (console output)
# - @var kdump_sysloglvl - logging level to syslog (by logger command)
# - @var kdump_kmsgloglvl - logging level to /dev/kmsg (only for boot-time)
-# If any of the variables is not set, this function set it to default:
-# - @var kdump_stdloglvl=4 (info)
-# - @var kdump_sysloglvl=4 (info)
-# - @var kdump_kmsgloglvl=0 (no logging)
#
-# Logging levels: fatal(1),error(2),warn(3),info(4),debug(5),trace(6)
+# In the second kernel, kdump will use the rd.kdumploglvl option to set the
+# log level in the above KDUMP_COMMANDLINE_APPEND.
+# - @var rd.kdumploglvl - logging level to syslog (by logger command)
#
-# For example: the following configurations indicate that kdump messages will be printed
-# to console and journald for debugging case.
-# kdump_sysloglvl=5
-# kdump_stdloglvl=5
+# Logging levels: no logging(0), error(1),warn(2),info(3),debug(4)
+#
+kdump_stdloglvl=3
+kdump_sysloglvl=3
+kdump_kmsgloglvl=0
diff --git a/kdump.sysconfig.i386 b/kdump.sysconfig.i386
index 2eb9705e32e9..da37cd90d8a0 100644
--- a/kdump.sysconfig.i386
+++ b/kdump.sysconfig.i386
@@ -21,7 +21,7 @@ KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet log_buf_len swio
# This variable lets us append arguments to the current kdump commandline
# after processed by KDUMP_COMMANDLINE_REMOVE
-KDUMP_COMMANDLINE_APPEND="irqpoll nr_cpus=1 reset_devices numa=off udev.children-max=2 panic=10 transparent_hugepage=never novmcoredd"
+KDUMP_COMMANDLINE_APPEND="irqpoll nr_cpus=1 reset_devices numa=off udev.children-max=2 panic=10 transparent_hugepage=never novmcoredd rd.kdumploglvl=3"
# Any additional kexec arguments required. In most situations, this should
# be left empty
@@ -39,18 +39,17 @@ KDUMP_IMG="vmlinuz"
#What is the images extension. Relocatable kernels don't have one
KDUMP_IMG_EXT=""
-# Logging is controlled by following global variables:
+# Logging is controlled by following global variables in the first kernel:
# - @var kdump_stdloglvl - logging level to standard error (console output)
# - @var kdump_sysloglvl - logging level to syslog (by logger command)
# - @var kdump_kmsgloglvl - logging level to /dev/kmsg (only for boot-time)
-# If any of the variables is not set, this function set it to default:
-# - @var kdump_stdloglvl=4 (info)
-# - @var kdump_sysloglvl=4 (info)
-# - @var kdump_kmsgloglvl=0 (no logging)
#
-# Logging levels: fatal(1),error(2),warn(3),info(4),debug(5),trace(6)
+# In the second kernel, kdump will use the rd.kdumploglvl option to set the
+# log level in the above KDUMP_COMMANDLINE_APPEND.
+# - @var rd.kdumploglvl - logging level to syslog (by logger command)
#
-# For example: the following configurations indicate that kdump messages will be printed
-# to console and journald for debugging case.
-# kdump_sysloglvl=5
-# kdump_stdloglvl=5
+# Logging levels: no logging(0), error(1),warn(2),info(3),debug(4)
+#
+kdump_stdloglvl=3
+kdump_sysloglvl=3
+kdump_kmsgloglvl=0
diff --git a/kdump.sysconfig.ppc64 b/kdump.sysconfig.ppc64
index 24279ff34211..2c91dcd56461 100644
--- a/kdump.sysconfig.ppc64
+++ b/kdump.sysconfig.ppc64
@@ -21,7 +21,7 @@ KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet log_buf_len swio
# This variable lets us append arguments to the current kdump commandline
# after processed by KDUMP_COMMANDLINE_REMOVE
-KDUMP_COMMANDLINE_APPEND="irqpoll maxcpus=1 noirqdistrib reset_devices cgroup_disable=memory numa=off udev.children-max=2 ehea.use_mcs=0 panic=10 kvm_cma_resv_ratio=0 transparent_hugepage=never novmcoredd"
+KDUMP_COMMANDLINE_APPEND="irqpoll maxcpus=1 noirqdistrib reset_devices cgroup_disable=memory numa=off udev.children-max=2 ehea.use_mcs=0 panic=10 kvm_cma_resv_ratio=0 transparent_hugepage=never novmcoredd rd.kdumploglvl=3"
# Any additional kexec arguments required. In most situations, this should
# be left empty
@@ -41,18 +41,17 @@ KDUMP_IMG_EXT=""
#Specify the action after failure
-# Logging is controlled by following global variables:
+# Logging is controlled by following global variables in the first kernel:
# - @var kdump_stdloglvl - logging level to standard error (console output)
# - @var kdump_sysloglvl - logging level to syslog (by logger command)
# - @var kdump_kmsgloglvl - logging level to /dev/kmsg (only for boot-time)
-# If any of the variables is not set, this function set it to default:
-# - @var kdump_stdloglvl=4 (info)
-# - @var kdump_sysloglvl=4 (info)
-# - @var kdump_kmsgloglvl=0 (no logging)
#
-# Logging levels: fatal(1),error(2),warn(3),info(4),debug(5),trace(6)
+# In the second kernel, kdump will use the rd.kdumploglvl option to set the
+# log level in the above KDUMP_COMMANDLINE_APPEND.
+# - @var rd.kdumploglvl - logging level to syslog (by logger command)
#
-# For example: the following configurations indicate that kdump messages will be printed
-# to console and journald for debugging case.
-# kdump_sysloglvl=5
-# kdump_stdloglvl=5
+# Logging levels: no logging(0), error(1),warn(2),info(3),debug(4)
+#
+kdump_stdloglvl=3
+kdump_sysloglvl=3
+kdump_kmsgloglvl=0
diff --git a/kdump.sysconfig.ppc64le b/kdump.sysconfig.ppc64le
index 24279ff34211..2c91dcd56461 100644
--- a/kdump.sysconfig.ppc64le
+++ b/kdump.sysconfig.ppc64le
@@ -21,7 +21,7 @@ KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet log_buf_len swio
# This variable lets us append arguments to the current kdump commandline
# after processed by KDUMP_COMMANDLINE_REMOVE
-KDUMP_COMMANDLINE_APPEND="irqpoll maxcpus=1 noirqdistrib reset_devices cgroup_disable=memory numa=off udev.children-max=2 ehea.use_mcs=0 panic=10 kvm_cma_resv_ratio=0 transparent_hugepage=never novmcoredd"
+KDUMP_COMMANDLINE_APPEND="irqpoll maxcpus=1 noirqdistrib reset_devices cgroup_disable=memory numa=off udev.children-max=2 ehea.use_mcs=0 panic=10 kvm_cma_resv_ratio=0 transparent_hugepage=never novmcoredd rd.kdumploglvl=3"
# Any additional kexec arguments required. In most situations, this should
# be left empty
@@ -41,18 +41,17 @@ KDUMP_IMG_EXT=""
#Specify the action after failure
-# Logging is controlled by following global variables:
+# Logging is controlled by following global variables in the first kernel:
# - @var kdump_stdloglvl - logging level to standard error (console output)
# - @var kdump_sysloglvl - logging level to syslog (by logger command)
# - @var kdump_kmsgloglvl - logging level to /dev/kmsg (only for boot-time)
-# If any of the variables is not set, this function set it to default:
-# - @var kdump_stdloglvl=4 (info)
-# - @var kdump_sysloglvl=4 (info)
-# - @var kdump_kmsgloglvl=0 (no logging)
#
-# Logging levels: fatal(1),error(2),warn(3),info(4),debug(5),trace(6)
+# In the second kernel, kdump will use the rd.kdumploglvl option to set the
+# log level in the above KDUMP_COMMANDLINE_APPEND.
+# - @var rd.kdumploglvl - logging level to syslog (by logger command)
#
-# For example: the following configurations indicate that kdump messages will be printed
-# to console and journald for debugging case.
-# kdump_sysloglvl=5
-# kdump_stdloglvl=5
+# Logging levels: no logging(0), error(1),warn(2),info(3),debug(4)
+#
+kdump_stdloglvl=3
+kdump_sysloglvl=3
+kdump_kmsgloglvl=0
diff --git a/kdump.sysconfig.s390x b/kdump.sysconfig.s390x
index 5e1cb5a7ad89..add43dbc8c34 100644
--- a/kdump.sysconfig.s390x
+++ b/kdump.sysconfig.s390x
@@ -21,7 +21,7 @@ KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet log_buf_len swio
# This variable lets us append arguments to the current kdump commandline
# after processed by KDUMP_COMMANDLINE_REMOVE
-KDUMP_COMMANDLINE_APPEND="nr_cpus=1 cgroup_disable=memory numa=off udev.children-max=2 panic=10 transparent_hugepage=never novmcoredd"
+KDUMP_COMMANDLINE_APPEND="nr_cpus=1 cgroup_disable=memory numa=off udev.children-max=2 panic=10 transparent_hugepage=never novmcoredd rd.kdumploglvl=3"
# Any additional /sbin/mkdumprd arguments required.
MKDUMPRD_ARGS=""
@@ -42,18 +42,17 @@ KDUMP_IMG="vmlinuz"
#What is the images extension. Relocatable kernels don't have one
KDUMP_IMG_EXT=""
-# Logging is controlled by following global variables:
+# Logging is controlled by following global variables in the first kernel:
# - @var kdump_stdloglvl - logging level to standard error (console output)
# - @var kdump_sysloglvl - logging level to syslog (by logger command)
# - @var kdump_kmsgloglvl - logging level to /dev/kmsg (only for boot-time)
-# If any of the variables is not set, this function set it to default:
-# - @var kdump_stdloglvl=4 (info)
-# - @var kdump_sysloglvl=4 (info)
-# - @var kdump_kmsgloglvl=0 (no logging)
#
-# Logging levels: fatal(1),error(2),warn(3),info(4),debug(5),trace(6)
+# In the second kernel, kdump will use the rd.kdumploglvl option to set the
+# log level in the above KDUMP_COMMANDLINE_APPEND.
+# - @var rd.kdumploglvl - logging level to syslog (by logger command)
#
-# For example: the following configurations indicate that kdump messages will be printed
-# to console and journald for debugging case.
-# kdump_sysloglvl=5
-# kdump_stdloglvl=5
+# Logging levels: no logging(0), error(1),warn(2),info(3),debug(4)
+#
+kdump_stdloglvl=3
+kdump_sysloglvl=3
+kdump_kmsgloglvl=0
diff --git a/kdump.sysconfig.x86_64 b/kdump.sysconfig.x86_64
index eb1c53824241..fb0da9f33cb7 100644
--- a/kdump.sysconfig.x86_64
+++ b/kdump.sysconfig.x86_64
@@ -21,7 +21,7 @@ KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet log_buf_len swio
# This variable lets us append arguments to the current kdump commandline
# after processed by KDUMP_COMMANDLINE_REMOVE
-KDUMP_COMMANDLINE_APPEND="irqpoll nr_cpus=1 reset_devices cgroup_disable=memory mce=off numa=off udev.children-max=2 panic=10 acpi_no_memhotplug transparent_hugepage=never nokaslr hest_disable novmcoredd"
+KDUMP_COMMANDLINE_APPEND="irqpoll nr_cpus=1 reset_devices cgroup_disable=memory mce=off numa=off udev.children-max=2 panic=10 acpi_no_memhotplug transparent_hugepage=never nokaslr hest_disable novmcoredd rd.kdumploglvl=3"
# Any additional kexec arguments required. In most situations, this should
# be left empty
@@ -39,18 +39,17 @@ KDUMP_IMG="vmlinuz"
#What is the images extension. Relocatable kernels don't have one
KDUMP_IMG_EXT=""
-# Logging is controlled by following global variables:
+# Logging is controlled by following global variables in the first kernel:
# - @var kdump_stdloglvl - logging level to standard error (console output)
# - @var kdump_sysloglvl - logging level to syslog (by logger command)
# - @var kdump_kmsgloglvl - logging level to /dev/kmsg (only for boot-time)
-# If any of the variables is not set, this function set it to default:
-# - @var kdump_stdloglvl=4 (info)
-# - @var kdump_sysloglvl=4 (info)
-# - @var kdump_kmsgloglvl=0 (no logging)
#
-# Logging levels: fatal(1),error(2),warn(3),info(4),debug(5),trace(6)
+# In the second kernel, kdump will use the rd.kdumploglvl option to set the
+# log level in the above KDUMP_COMMANDLINE_APPEND.
+# - @var rd.kdumploglvl - logging level to syslog (by logger command)
#
-# For example: the following configurations indicate that kdump messages will be printed
-# to console and journald for debugging case.
-# kdump_sysloglvl=5
-# kdump_stdloglvl=5
+# Logging levels: no logging(0), error(1),warn(2),info(3),debug(4)
+#
+kdump_stdloglvl=3
+kdump_sysloglvl=3
+kdump_kmsgloglvl=0
--
2.17.1
3 years, 4 months
[PATCH v4] Doc: improve the usage documentation of the logger
by Lianbo Jiang
Let's remove some redundant descriptions in the usage documentation
of the logger, and make it clear.
Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
---
kexec-kdump-howto.txt | 110 ++++++++++++++++++++++++++++++------------
1 file changed, 78 insertions(+), 32 deletions(-)
diff --git a/kexec-kdump-howto.txt b/kexec-kdump-howto.txt
index 5f57a8428e4f..2839b89ef3eb 100644
--- a/kexec-kdump-howto.txt
+++ b/kexec-kdump-howto.txt
@@ -888,35 +888,81 @@ Debugging Tips
- Using the logger to output kdump log messages
- Currently, kdump messages are printed with the 'echo' command or redirect
- to console, and which does not support to output kdump messages according
- to the log level.
-
- That is not convenient to debug kdump issues, we usually need to capture
- additional debugging information via the modification of the options or the
- scripts like kdumpctl, mkdumprd, etc. Because there is no complete debugging
- messages, which could waste valuable time.
-
- To cope with this challenging, we introduce the logger to output the kdump
- messages according to the log level, and provide a chance to save logs to
- the journald if the journald service is available, and then dump all logs
- to a file, otherwise dump the logs with the dmesg to a file.
-
- Logging is controlled by following global variables:
- - @var kdump_stdloglvl - logging level to standard error (console output)
- - @var kdump_sysloglvl - logging level to syslog (by logger command)
- - @var kdump_kmsgloglvl - logging level to /dev/kmsg (only for boot-time)
- If any of the variables is not set, this function set it to default:
- - @var kdump_stdloglvl=4 (info)
- - @var kdump_sysloglvl=4 (info)
- - @var kdump_kmsgloglvl=0 (no logging)
-
- Logging levels: fatal(1),error(2),warn(3),info(4),debug(5),trace(6)
-
- We can easily configure the above variables in the /etc/sysconfig/kdump. For
- example:
- kdump_sysloglvl=5
- kdump_stdloglvl=5
-
- The above configurations indicate that kdump messages will be printed to the
- console and journald if the journald service is enabled.
+ You can configure the kdump log level for the first kernel in the
+ /etc/sysconfig/kdump. For example:
+
+ kdump_stdloglvl=3
+ kdump_sysloglvl=3
+ kdump_kmsgloglvl=0
+
+ The above configurations indicate that kdump messages will be printed
+ to the console and journald if the journald service is enabled, and
+ the kdump_stdloglvl and kdump_sysloglvl are set to 3(info), but the
+ kdump_kmsgloglvl is set to 0(no logging). This is also the current
+ default log levels in the first kernel.
+
+ In the second kernel, you can add the 'rd.kdumploglvl=X' option to the
+ KDUMP_COMMANDLINE_APPEND in the /etc/sysconfig/kdump so that you can also
+ set the log levels for the second kernel. The 'X' represents the logging
+ levels, the default log level is 3(info) in the second kernel, for example:
+
+ # cat /etc/sysconfig/kdump |grep rd.kdumploglvl
+ KDUMP_COMMANDLINE_APPEND="irqpoll nr_cpus=1 reset_devices cgroup_disable=memory mce=off numa=off udev.children-max=2 panic=10 acpi_no_memhotplug transparent_hugepage=never nokaslr hest_disable novmcoredd rd.kdumploglvl=3"
+
+ Logging levels: no logging(0), error(1),warn(2),info(3),debug(4)
+
+ The ERROR level designates error events that might still allow the application
+ to continue running.
+
+ The WARN level designates potentially harmful situations.
+
+ The INFO level designates informational messages that highlight the progress
+ of the application at coarse-grained level.
+
+ The DEBUG level designates fine-grained informational events that are most
+ useful to debug an application.
+
+ Note: if you set the log level to 0, that will disable the logs at the
+ corresponding log level, which indicates that it has no log output.
+
+ At present, the logger works in both the first kernel(kdump service debugging)
+ and the second kernel.
+
+ In the first kernel, you can find the historical logs with the journalctl
+ command and check kdump service debugging information. In addition, the
+ 'kexec -d' debugging messages are also saved to /var/log/kdump.log in the
+ first kernel. For example:
+
+ [root@ibm-z-109 ~]# ls -al /var/log/kdump.log
+ -rw-r--r--. 1 root root 63238 Oct 28 06:40 /var/log/kdump.log
+
+ If you want to get the debugging information of building kdump initramfs, you
+ can enable the '--debug' option for the dracut_args in the /etc/kdump.conf, and
+ then rebuild the kdump initramfs as below:
+
+ # systemctl restart kdump.service
+
+ That will rebuild the kdump initramfs and gerenate some logs to journald, you
+ can find the dracut logs with the journalctl command.
+
+ In the second kernel, kdump will automatically put the kexec-dmesg.log to a same
+ directory with the vmcore, the log file includes the debugging messages like dmesg
+ and journald logs. For example:
+
+ [root@ibm-z-109 ~]# ls -al /var/crash/127.0.0.1-2020-10-28-02\:01\:23/
+ drwxr-xr-x. 2 root root 67 Oct 28 02:02 .
+ drwxr-xr-x. 6 root root 154 Oct 28 02:01 ..
+ -rw-r--r--. 1 root root 21164 Oct 28 02:01 kexec-dmesg.log
+ -rw-------. 1 root root 74238698 Oct 28 02:01 vmcore
+ -rw-r--r--. 1 root root 17532 Oct 28 02:01 vmcore-dmesg.txt
+
+ If you want to get more debugging information in the second kernel, you can add
+ the 'rd.debug' option to the KDUMP_COMMANDLINE_APPEND in the /etc/sysconfig/kdump,
+ and then reload them in order to make the changes take effect.
+
+ In addition, you can also add the 'rd.memdebug=X' option to the KDUMP_COMMANDLINE_APPEND
+ in the /etc/sysconfig/kdump in order to output the additional information about
+ kernel module memory consumption during loading.
+
+ For more details, please refer to the /etc/sysconfig/kdump, or the man page of
+ dracut.cmdline and kdump.conf.
--
2.17.1
3 years, 4 months
[PATCH] Remove unused log level and update kdump sysconfig
by Lianbo Jiang
Previously, the range of log level is from 1 to 6, and the TRACE
level and FATAL level are not used, therefore, let's remove these
unused log levels and update the kdump sysconfig accordingly.
Nowadays it has only four log levels: error(1), warn(2), info(3)
and debug(4). We have to remap the numeric log level to the logger
priority or syslog log level, which is finished in kdump-logger.sh
module, it is invisible for user.
Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
---
dracut-module-setup.sh | 4 +-
kdump-logger.sh | 162 +++++++++++-----------------------------
kdump.sysconfig | 12 +--
kdump.sysconfig.aarch64 | 12 +--
kdump.sysconfig.i386 | 12 +--
kdump.sysconfig.ppc64 | 12 +--
kdump.sysconfig.ppc64le | 12 +--
kdump.sysconfig.s390x | 12 +--
kdump.sysconfig.x86_64 | 12 +--
9 files changed, 89 insertions(+), 161 deletions(-)
diff --git a/dracut-module-setup.sh b/dracut-module-setup.sh
index 911a8b84de9d..718edf98e857 100755
--- a/dracut-module-setup.sh
+++ b/dracut-module-setup.sh
@@ -33,7 +33,7 @@ depends() {
if is_squash_available && ! is_fadump_capable; then
_dep="$_dep squash"
else
- dwarning "Required modules to build a squashed kdump image is missing!"
+ dwarn "Required modules to build a squashed kdump image is missing!"
fi
if [ -n "$( find /sys/devices -name drm )" ] || [ -d /sys/module/hyperv_fb ]; then
@@ -72,7 +72,7 @@ source_ifcfg_file() {
if [ -f "${ifcfg_file}" ]; then
. ${ifcfg_file}
else
- dwarning "The ifcfg file of $1 is not found!"
+ dwarn "The ifcfg file of $1 is not found!"
fi
}
diff --git a/kdump-logger.sh b/kdump-logger.sh
index a3d674cd07c2..0645ad8780db 100755
--- a/kdump-logger.sh
+++ b/kdump-logger.sh
@@ -2,24 +2,18 @@
#
# This comes from the dracut-logger.sh
#
-# The logger defined 6 logging levels:
-# - dtrace() (6)
-# The TRACE Level designates finer-grained informational events than the
-# DEBUG.
-# - ddebug (5)
+# The logger defined 4 logging levels:
+# - ddebug (4)
# The DEBUG Level designates fine-grained informational events that are most
# useful to debug an application.
-# - dinfo (4)
+# - dinfo (3)
# The INFO level designates informational messages that highlight the
# progress of the application at coarse-grained level.
-# - dwarn (3)
+# - dwarn (2)
# The WARN level designates potentially harmful situations.
-# - derror (2)
+# - derror (1)
# The ERROR level designates error events that might still allow the
# application to continue running.
-# - dfatal (1)
-# The FATAL level designates very severe error events that will presumably
-# lead the application to abort.
#
# Logging is controlled by following global variables:
# - @var kdump_stdloglvl - logging level to standard error (console output)
@@ -27,8 +21,8 @@
# - @var kdump_kmsgloglvl - logging level to /dev/kmsg (only for boot-time)
#
# If any of the variables is not set, this function set it to default:
-# - @var kdump_stdloglvl = 4 (info)
-# - @var kdump_sysloglvl = 4 (info)
+# - @var kdump_stdloglvl = 3 (info)
+# - @var kdump_sysloglvl = 3 (info)
# - @var kdump_kmsgloglvl = 0 (no logging)
#
# First of all you have to start with dlog_init() function which initializes
@@ -42,7 +36,7 @@
check_loglvl()
{
case "$1" in
- 0|1|2|3|4|5|6)
+ 0|1|2|3|4)
return 0
;;
*)
@@ -58,8 +52,8 @@ check_loglvl()
dlog_init() {
local ret=0; local errmsg
- [ -z "$kdump_stdloglvl" ] && kdump_stdloglvl=4
- [ -z "$kdump_sysloglvl" ] && kdump_sysloglvl=4
+ [ -z "$kdump_stdloglvl" ] && kdump_stdloglvl=3
+ [ -z "$kdump_sysloglvl" ] && kdump_sysloglvl=3
[ -z "$kdump_kmsgloglvl" ] && kdump_kmsgloglvl=0
for loglvl in $kdump_stdloglvl $kdump_kmsgloglvl $kdump_sysloglvl; do
@@ -103,83 +97,50 @@ dlog_init() {
readonly kdump_maxloglvl=$maxloglvl_l
export kdump_maxloglvl
-
- if [[ $kdump_stdloglvl -lt 6 ]] && [[ $kdump_kmsgloglvl -lt 6 ]] && [[ $kdump_sysloglvl -lt 6 ]]; then
- unset dtrace
- dtrace() { :; };
- fi
-
- if [[ $kdump_stdloglvl -lt 5 ]] && [[ $kdump_kmsgloglvl -lt 5 ]] && [[ $kdump_sysloglvl -lt 5 ]]; then
+ if [[ $kdump_stdloglvl -lt 4 ]] && [[ $kdump_kmsgloglvl -lt 4 ]] && [[ $kdump_sysloglvl -lt 4 ]]; then
unset ddebug
ddebug() { :; };
fi
- if [[ $kdump_stdloglvl -lt 4 ]] && [[ $kdump_kmsgloglvl -lt 4 ]] && [[ $kdump_sysloglvl -lt 4 ]]; then
+ if [[ $kdump_stdloglvl -lt 3 ]] && [[ $kdump_kmsgloglvl -lt 3 ]] && [[ $kdump_sysloglvl -lt 3 ]]; then
unset dinfo
dinfo() { :; };
fi
- if [[ $kdump_stdloglvl -lt 3 ]] && [[ $kdump_kmsgloglvl -lt 3 ]] && [[ $kdump_sysloglvl -lt 3 ]]; then
+ if [[ $kdump_stdloglvl -lt 2 ]] && [[ $kdump_kmsgloglvl -lt 2 ]] && [[ $kdump_sysloglvl -lt 2 ]]; then
unset dwarn
dwarn() { :; };
- unset dwarning
- dwarning() { :; };
fi
- if [[ $kdump_stdloglvl -lt 2 ]] && [[ $kdump_kmsgloglvl -lt 2 ]] && [[ $kdump_sysloglvl -lt 2 ]]; then
+ if [[ $kdump_stdloglvl -lt 1 ]] && [[ $kdump_kmsgloglvl -lt 1 ]] && [[ $kdump_sysloglvl -lt 1 ]]; then
unset derror
derror() { :; };
fi
- if [[ $kdump_stdloglvl -lt 1 ]] && [[ $kdump_kmsgloglvl -lt 1 ]] && [[ $kdump_sysloglvl -lt 1 ]]; then
- unset dfatal
- dfatal() { :; };
- fi
-
[ -n "$errmsg" ] && derror "$errmsg"
return $ret
}
-## @brief Converts numeric logging level to the first letter of level name.
-#
-# @param lvl Numeric logging level in range from 1 to 6.
-# @retval 1 if @a lvl is out of range.
-# @retval 0 if @a lvl is correct.
-# @result Echoes first letter of level name.
-_lvl2char() {
- case "$1" in
- 1) echo F;;
- 2) echo E;;
- 3) echo W;;
- 4) echo I;;
- 5) echo D;;
- 6) echo T;;
- *) return 1;;
- esac
-}
-
## @brief Converts numeric level to logger priority defined by POSIX.2.
#
-# @param lvl Numeric logging level in range from 1 to 6.
+# @param lvl Numeric logging level in range from 1 to 4.
# @retval 1 if @a lvl is out of range.
# @retval 0 if @a lvl is correct.
# @result Echoes logger priority.
_lvl2syspri() {
case "$1" in
- 1) echo crit;;
- 2) echo error;;
- 3) echo warning;;
- 4) echo info;;
- 5) echo debug;;
- 6) echo debug;;
+ 1) echo error;;
+ 2) echo warning;;
+ 3) echo info;;
+ 4) echo debug;;
*) return 1;;
esac
}
## @brief Converts logger numeric level to syslog log level
#
-# @param lvl Numeric logging level in range from 1 to 6.
+# @param lvl Numeric logging level in range from 1 to 4.
# @retval 1 if @a lvl is out of range.
# @retval 0 if @a lvl is correct.
# @result Echoes kernel console numeric log level
@@ -189,13 +150,12 @@ _lvl2syspri() {
# <tt>
# none -> LOG_EMERG (0)
# none -> LOG_ALERT (1)
-# FATAL(1) -> LOG_CRIT (2)
-# ERROR(2) -> LOG_ERR (3)
-# WARN(3) -> LOG_WARNING (4)
+# none -> LOG_CRIT (2)
+# ERROR(1) -> LOG_ERR (3)
+# WARN(2) -> LOG_WARNING (4)
# none -> LOG_NOTICE (5)
-# INFO(4) -> LOG_INFO (6)
-# DEBUG(5) -> LOG_DEBUG (7)
-# TRACE(6) /
+# INFO(3) -> LOG_INFO (6)
+# DEBUG(4) -> LOG_DEBUG (7)
# </tt>
#
# @see /usr/include/sys/syslog.h
@@ -203,16 +163,17 @@ _dlvl2syslvl() {
local lvl
case "$1" in
- 1) lvl=2;;
- 2) lvl=3;;
- 3) lvl=4;;
- 4) lvl=6;;
- 5) lvl=7;;
- 6) lvl=7;;
+ 1) lvl=3;;
+ 2) lvl=4;;
+ 3) lvl=6;;
+ 4) lvl=7;;
*) return 1;;
esac
- [ -s /proc/vmcore ] && echo $((24+$lvl)) || echo $((8+$lvl))
+ # The number is constructed by multiplying the facility by 8 and then
+ # adding the level.
+ # About The Syslog Protocol, please refer to the RFC5424 for more details.
+ echo $((24+$lvl))
}
## @brief Prints to stderr and/or writes to file, to syslog and/or /dev/kmsg
@@ -223,10 +184,10 @@ _dlvl2syslvl() {
# @retval 0 It's always returned, even if logging failed.
#
# @note This function is not supposed to be called manually. Please use
-# dtrace(), ddebug(), or others instead which wrap this one.
+# dinfo(), ddebug(), or others instead which wrap this one.
#
-# This is core logging function which logs given message to standard error, file
-# and/or syslog (with POSIX shell command <tt>logger</tt>) and/or to /dev/kmsg.
+# This is core logging function which logs given message to standard error
+# and syslog (with POSIX shell command <tt>logger</tt>) and/or to /dev/kmsg.
# The format is following:
#
# <tt>X: some message</tt>
@@ -236,16 +197,13 @@ _dlvl2syslvl() {
#
# Message to syslog is sent with tag @c kdump. Priorities are mapped as
# following:
-# - @c FATAL to @c crit
# - @c ERROR to @c error
# - @c WARN to @c warning
# - @c INFO to @c info
-# - @c DEBUG and @c TRACE both to @c debug
+# - @c DEBUG to @c debug
_do_dlog() {
local lvl="$1"; shift
- local lvlc=$(_lvl2char "$lvl") || return 0
local msg="$*"
- local lmsg="$lvlc: $*"
[[ $lvl -le $kdump_stdloglvl ]] && printf -- 'kdump: %s\n' "$msg" >&2
@@ -268,7 +226,7 @@ _do_dlog() {
# @retval 0 It's always returned, even if logging failed.
#
# @note This function is not supposed to be called manually. Please use
-# dtrace(), ddebug(), or others instead which wrap this one.
+# dinfo(), ddebug(), or others instead which wrap this one.
#
# This function calls _do_dlog() either with parameter msg, or if
# none is given, it will read standard input and will use every line as
@@ -290,71 +248,41 @@ dlog() {
fi
}
-## @brief Logs message at TRACE level (6)
-#
-# @param msg Message.
-# @retval 0 It's always returned, even if logging failed.
-dtrace() {
- set +x
- dlog 6 "$@"
- [ -n "$debug" ] && set -x || :
-}
-
-## @brief Logs message at DEBUG level (5)
+## @brief Logs message at DEBUG level (4)
#
# @param msg Message.
# @retval 0 It's always returned, even if logging failed.
ddebug() {
- set +x
- dlog 5 "$@"
- [ -n "$debug" ] && set -x || :
-}
-
-## @brief Logs message at INFO level (4)
-#
-# @param msg Message.
-# @retval 0 It's always returned, even if logging failed.
-dinfo() {
set +x
dlog 4 "$@"
[ -n "$debug" ] && set -x || :
}
-## @brief Logs message at WARN level (3)
+## @brief Logs message at INFO level (3)
#
# @param msg Message.
# @retval 0 It's always returned, even if logging failed.
-dwarn() {
+dinfo() {
set +x
dlog 3 "$@"
[ -n "$debug" ] && set -x || :
}
-## @brief It's an alias to dwarn() function.
-#
-# @param msg Message.
-# @retval 0 It's always returned, even if logging failed.
-dwarning() {
- set +x
- dwarn "$@"
- [ -n "$debug" ] && set -x || :
-}
-
-## @brief Logs message at ERROR level (2)
+## @brief Logs message at WARN level (2)
#
# @param msg Message.
# @retval 0 It's always returned, even if logging failed.
-derror() {
+dwarn() {
set +x
dlog 2 "$@"
[ -n "$debug" ] && set -x || :
}
-## @brief Logs message at FATAL level (1)
+## @brief Logs message at ERROR level (1)
#
# @param msg Message.
# @retval 0 It's always returned, even if logging failed.
-dfatal() {
+derror() {
set +x
dlog 1 "$@"
[ -n "$debug" ] && set -x || :
diff --git a/kdump.sysconfig b/kdump.sysconfig
index 52a0b9249fe7..d956be32f5e9 100644
--- a/kdump.sysconfig
+++ b/kdump.sysconfig
@@ -41,13 +41,13 @@ KDUMP_IMG="vmlinuz"
# - @var kdump_sysloglvl - logging level to syslog (by logger command)
# - @var kdump_kmsgloglvl - logging level to /dev/kmsg (only for boot-time)
# If any of the variables is not set, this function set it to default:
-# - @var kdump_stdloglvl=4 (info)
-# - @var kdump_sysloglvl=4 (info)
+# - @var kdump_stdloglvl=3 (info)
+# - @var kdump_sysloglvl=3 (info)
# - @var kdump_kmsgloglvl=0 (no logging)
#
-# Logging levels: fatal(1),error(2),warn(3),info(4),debug(5),trace(6)
+# Logging levels: error(1),warn(2),info(3),debug(4)
#
# For example: the following configurations indicate that kdump messages will be printed
-# to console and journald for debugging case.
-# kdump_sysloglvl=5
-# kdump_stdloglvl=5
+# to console and journald, and this is also the current default log level(3).
+# kdump_sysloglvl=3
+# kdump_stdloglvl=3
diff --git a/kdump.sysconfig.aarch64 b/kdump.sysconfig.aarch64
index 1d75979df03e..5164b708903b 100644
--- a/kdump.sysconfig.aarch64
+++ b/kdump.sysconfig.aarch64
@@ -41,13 +41,13 @@ KDUMP_IMG="vmlinuz"
# - @var kdump_sysloglvl - logging level to syslog (by logger command)
# - @var kdump_kmsgloglvl - logging level to /dev/kmsg (only for boot-time)
# If any of the variables is not set, this function set it to default:
-# - @var kdump_stdloglvl=4 (info)
-# - @var kdump_sysloglvl=4 (info)
+# - @var kdump_stdloglvl=3 (info)
+# - @var kdump_sysloglvl=3 (info)
# - @var kdump_kmsgloglvl=0 (no logging)
#
-# Logging levels: fatal(1),error(2),warn(3),info(4),debug(5),trace(6)
+# Logging levels: error(1),warn(2),info(3),debug(4)
#
# For example: the following configurations indicate that kdump messages will be printed
-# to console and journald for debugging case.
-# kdump_sysloglvl=5
-# kdump_stdloglvl=5
+# to console and journald, and this is also the current default log level(3).
+# kdump_sysloglvl=3
+# kdump_stdloglvl=3
diff --git a/kdump.sysconfig.i386 b/kdump.sysconfig.i386
index 2eb9705e32e9..a335416c42ac 100644
--- a/kdump.sysconfig.i386
+++ b/kdump.sysconfig.i386
@@ -44,13 +44,13 @@ KDUMP_IMG_EXT=""
# - @var kdump_sysloglvl - logging level to syslog (by logger command)
# - @var kdump_kmsgloglvl - logging level to /dev/kmsg (only for boot-time)
# If any of the variables is not set, this function set it to default:
-# - @var kdump_stdloglvl=4 (info)
-# - @var kdump_sysloglvl=4 (info)
+# - @var kdump_stdloglvl=3 (info)
+# - @var kdump_sysloglvl=3 (info)
# - @var kdump_kmsgloglvl=0 (no logging)
#
-# Logging levels: fatal(1),error(2),warn(3),info(4),debug(5),trace(6)
+# Logging levels: error(1),warn(2),info(3),debug(4)
#
# For example: the following configurations indicate that kdump messages will be printed
-# to console and journald for debugging case.
-# kdump_sysloglvl=5
-# kdump_stdloglvl=5
+# to console and journald, and this is also the current default log level(3).
+# kdump_sysloglvl=3
+# kdump_stdloglvl=3
diff --git a/kdump.sysconfig.ppc64 b/kdump.sysconfig.ppc64
index 24279ff34211..ba3857434569 100644
--- a/kdump.sysconfig.ppc64
+++ b/kdump.sysconfig.ppc64
@@ -46,13 +46,13 @@ KDUMP_IMG_EXT=""
# - @var kdump_sysloglvl - logging level to syslog (by logger command)
# - @var kdump_kmsgloglvl - logging level to /dev/kmsg (only for boot-time)
# If any of the variables is not set, this function set it to default:
-# - @var kdump_stdloglvl=4 (info)
-# - @var kdump_sysloglvl=4 (info)
+# - @var kdump_stdloglvl=3 (info)
+# - @var kdump_sysloglvl=3 (info)
# - @var kdump_kmsgloglvl=0 (no logging)
#
-# Logging levels: fatal(1),error(2),warn(3),info(4),debug(5),trace(6)
+# Logging levels: error(1),warn(2),info(3),debug(4)
#
# For example: the following configurations indicate that kdump messages will be printed
-# to console and journald for debugging case.
-# kdump_sysloglvl=5
-# kdump_stdloglvl=5
+# to console and journald, and this is also the current default log level(3).
+# kdump_sysloglvl=3
+# kdump_stdloglvl=3
diff --git a/kdump.sysconfig.ppc64le b/kdump.sysconfig.ppc64le
index 24279ff34211..ba3857434569 100644
--- a/kdump.sysconfig.ppc64le
+++ b/kdump.sysconfig.ppc64le
@@ -46,13 +46,13 @@ KDUMP_IMG_EXT=""
# - @var kdump_sysloglvl - logging level to syslog (by logger command)
# - @var kdump_kmsgloglvl - logging level to /dev/kmsg (only for boot-time)
# If any of the variables is not set, this function set it to default:
-# - @var kdump_stdloglvl=4 (info)
-# - @var kdump_sysloglvl=4 (info)
+# - @var kdump_stdloglvl=3 (info)
+# - @var kdump_sysloglvl=3 (info)
# - @var kdump_kmsgloglvl=0 (no logging)
#
-# Logging levels: fatal(1),error(2),warn(3),info(4),debug(5),trace(6)
+# Logging levels: error(1),warn(2),info(3),debug(4)
#
# For example: the following configurations indicate that kdump messages will be printed
-# to console and journald for debugging case.
-# kdump_sysloglvl=5
-# kdump_stdloglvl=5
+# to console and journald, and this is also the current default log level(3).
+# kdump_sysloglvl=3
+# kdump_stdloglvl=3
diff --git a/kdump.sysconfig.s390x b/kdump.sysconfig.s390x
index 5e1cb5a7ad89..78b1d4dcc129 100644
--- a/kdump.sysconfig.s390x
+++ b/kdump.sysconfig.s390x
@@ -47,13 +47,13 @@ KDUMP_IMG_EXT=""
# - @var kdump_sysloglvl - logging level to syslog (by logger command)
# - @var kdump_kmsgloglvl - logging level to /dev/kmsg (only for boot-time)
# If any of the variables is not set, this function set it to default:
-# - @var kdump_stdloglvl=4 (info)
-# - @var kdump_sysloglvl=4 (info)
+# - @var kdump_stdloglvl=3 (info)
+# - @var kdump_sysloglvl=3 (info)
# - @var kdump_kmsgloglvl=0 (no logging)
#
-# Logging levels: fatal(1),error(2),warn(3),info(4),debug(5),trace(6)
+# Logging levels: error(1),warn(2),info(3),debug(4)
#
# For example: the following configurations indicate that kdump messages will be printed
-# to console and journald for debugging case.
-# kdump_sysloglvl=5
-# kdump_stdloglvl=5
+# to console and journald, and this is also the current default log level(3).
+# kdump_sysloglvl=3
+# kdump_stdloglvl=3
diff --git a/kdump.sysconfig.x86_64 b/kdump.sysconfig.x86_64
index eb1c53824241..2c1966152853 100644
--- a/kdump.sysconfig.x86_64
+++ b/kdump.sysconfig.x86_64
@@ -44,13 +44,13 @@ KDUMP_IMG_EXT=""
# - @var kdump_sysloglvl - logging level to syslog (by logger command)
# - @var kdump_kmsgloglvl - logging level to /dev/kmsg (only for boot-time)
# If any of the variables is not set, this function set it to default:
-# - @var kdump_stdloglvl=4 (info)
-# - @var kdump_sysloglvl=4 (info)
+# - @var kdump_stdloglvl=3 (info)
+# - @var kdump_sysloglvl=3 (info)
# - @var kdump_kmsgloglvl=0 (no logging)
#
-# Logging levels: fatal(1),error(2),warn(3),info(4),debug(5),trace(6)
+# Logging levels: error(1),warn(2),info(3),debug(4)
#
# For example: the following configurations indicate that kdump messages will be printed
-# to console and journald for debugging case.
-# kdump_sysloglvl=5
-# kdump_stdloglvl=5
+# to console and journald, and this is also the current default log level(3).
+# kdump_sysloglvl=3
+# kdump_stdloglvl=3
--
2.17.1
3 years, 4 months
[PATCH v2] Doc: improve the usage documentation of the logger
by Lianbo Jiang
Let's remove some redundant descriptions in the usage
documentation of the logger, and make it clear.
Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
---
kexec-kdump-howto.txt | 81 ++++++++++++++++++++++++++++---------------
1 file changed, 53 insertions(+), 28 deletions(-)
diff --git a/kexec-kdump-howto.txt b/kexec-kdump-howto.txt
index 5f57a8428e4f..46ca99b994c0 100644
--- a/kexec-kdump-howto.txt
+++ b/kexec-kdump-howto.txt
@@ -888,35 +888,60 @@ Debugging Tips
- Using the logger to output kdump log messages
- Currently, kdump messages are printed with the 'echo' command or redirect
- to console, and which does not support to output kdump messages according
- to the log level.
-
- That is not convenient to debug kdump issues, we usually need to capture
- additional debugging information via the modification of the options or the
- scripts like kdumpctl, mkdumprd, etc. Because there is no complete debugging
- messages, which could waste valuable time.
-
- To cope with this challenging, we introduce the logger to output the kdump
- messages according to the log level, and provide a chance to save logs to
- the journald if the journald service is available, and then dump all logs
- to a file, otherwise dump the logs with the dmesg to a file.
-
- Logging is controlled by following global variables:
- - @var kdump_stdloglvl - logging level to standard error (console output)
- - @var kdump_sysloglvl - logging level to syslog (by logger command)
- - @var kdump_kmsgloglvl - logging level to /dev/kmsg (only for boot-time)
- If any of the variables is not set, this function set it to default:
- - @var kdump_stdloglvl=4 (info)
- - @var kdump_sysloglvl=4 (info)
- - @var kdump_kmsgloglvl=0 (no logging)
+ You can configure the kdump log level in the /etc/sysconfig/kdump.
+ For example:
+
+ kdump_sysloglvl=4
+ kdump_stdloglvl=4
+
+ The above configurations indicate that kdump messages will be printed to the
+ console and journald if the journald service is enabled, and the log level is
+ set to 4(info). This is also the current default log level.
Logging levels: fatal(1),error(2),warn(3),info(4),debug(5),trace(6)
- We can easily configure the above variables in the /etc/sysconfig/kdump. For
- example:
- kdump_sysloglvl=5
- kdump_stdloglvl=5
+ The FATAL level designates very severe error events that will presumably lead
+ the application to abort. Currently, the FATAL level is not used.
- The above configurations indicate that kdump messages will be printed to the
- console and journald if the journald service is enabled.
+ The ERROR level designates error events that might still allow the application
+ to continue running.
+
+ The WARN level designates potentially harmful situations.
+
+ The INFO level designates informational messages that highlight the progress
+ of the application at coarse-grained level.
+
+ The DEBUG level designates fine-grained informational events that are most
+ useful to debug an application.
+
+ The TRACE level designates finer-grained informational events than the DEBUG.
+ Currently, the TRACE level is not used.
+
+ At present, the logger works in both the first kernel(kdump service debugging)
+ and the second kernel. But the TRACE and FATAL level are not used(as mentioned
+ above), which are only kept here as a syslog conversion.
+
+ In the first kernel, you can find the historical logs with the journalctl
+ command and check kdump service debugging information. In addition, the
+ 'kexec -d' debugging messages are also saved to /var/log/kdump.log in the
+ first kernel. For example:
+
+ [root@ibm-z-109 ~]# ls -al /var/log/kdump.log
+ -rw-r--r--. 1 root root 63238 Oct 28 06:40 /var/log/kdump.log
+
+ In the second kernel, put the kexec-dmesg.log to a same directory with the
+ vmcore, the log file includes the debugging messages like dmesg and journald
+ logs. For example:
+
+ [root@ibm-z-109 ~]# ls -al /var/crash/127.0.0.1-2020-10-28-02\:01\:23/
+ drwxr-xr-x. 2 root root 67 Oct 28 02:02 .
+ drwxr-xr-x. 6 root root 154 Oct 28 02:01 ..
+ -rw-r--r--. 1 root root 21164 Oct 28 02:01 kexec-dmesg.log
+ -rw-------. 1 root root 74238698 Oct 28 02:01 vmcore
+ -rw-r--r--. 1 root root 17532 Oct 28 02:01 vmcore-dmesg.txt
+
+ If you want to get more debugging information in the second kernel, you can add
+ the 'rd.debug' option to the KDUMP_COMMANDLINE_APPEND in the /etc/sysconfig/kdump,
+ and then reload them in order to make the changes take effect.
+
+ For more details, please refer to the /etc/sysconfig/kdump.
--
2.17.1
3 years, 4 months
[PATCH] Fix comment about ssh dump target
by Kairui Song
When using ssh dump target, scp is always used, correct the comment.
Signed-off-by: Kairui Song <kasong(a)redhat.com>
---
kdump.conf.5 | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/kdump.conf.5 b/kdump.conf.5
index 34c996c..7f1c8a4 100644
--- a/kdump.conf.5
+++ b/kdump.conf.5
@@ -41,7 +41,7 @@ mount point.
.B ssh <user@server>
.RS
-Will scp /proc/vmcore to <user@server>:<path>/%HOST-%DATE/,
+Will save /proc/vmcore through ssh pipe to <user@server>:<path>/%HOST-%DATE/,
supports DNS. NOTE: make sure user has necessary write permissions on
server and that a fqdn is used as the server name.
.RE
--
2.28.0
3 years, 4 months
[PATCH] mkdumprd: Ensure kdumpbase is added
by Kairui Song
Dracut only check if a module failed installtion if the module is listed
in --add params. Without this param, if kdumpbase failed to install due
to any reason, dracut will still build the initramfs only print a
warning. Add this param to ensure it fail early.
Signed-off-by: Kairui Song <kasong(a)redhat.com>
---
mkdumprd | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mkdumprd b/mkdumprd
index 36f71b7..3ea1d19 100644
--- a/mkdumprd
+++ b/mkdumprd
@@ -17,7 +17,7 @@ SAVE_PATH=$(get_save_path)
OVERRIDE_RESETTABLE=0
extra_modules=""
-dracut_args="--quiet --hostonly --hostonly-cmdline --hostonly-i18n --hostonly-mode strict -o \"plymouth dash resume ifcfg earlykdump\""
+dracut_args="--add kdumpbase --quiet --hostonly --hostonly-cmdline --hostonly-i18n --hostonly-mode strict -o \"plymouth dash resume ifcfg earlykdump\""
readonly MKDUMPRD_TMPDIR="$(mktemp -d -t mkdumprd.XXXXXX)"
[ -d "$MKDUMPRD_TMPDIR" ] || perror_exit "dracut: mktemp -p -d -t dracut.XXXXXX failed."
--
2.28.0
3 years, 4 months
[PATCH] Doc: improve the usage documentation of the logger
by Lianbo Jiang
Let's remove some redundant descriptions in the usage
documentation of the logger, and make it clear.
Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
---
kexec-kdump-howto.txt | 65 ++++++++++++++++++++++++-------------------
1 file changed, 37 insertions(+), 28 deletions(-)
diff --git a/kexec-kdump-howto.txt b/kexec-kdump-howto.txt
index 5f57a8428e4f..d2dba492ed60 100644
--- a/kexec-kdump-howto.txt
+++ b/kexec-kdump-howto.txt
@@ -888,35 +888,44 @@ Debugging Tips
- Using the logger to output kdump log messages
- Currently, kdump messages are printed with the 'echo' command or redirect
- to console, and which does not support to output kdump messages according
- to the log level.
-
- That is not convenient to debug kdump issues, we usually need to capture
- additional debugging information via the modification of the options or the
- scripts like kdumpctl, mkdumprd, etc. Because there is no complete debugging
- messages, which could waste valuable time.
-
- To cope with this challenging, we introduce the logger to output the kdump
- messages according to the log level, and provide a chance to save logs to
- the journald if the journald service is available, and then dump all logs
- to a file, otherwise dump the logs with the dmesg to a file.
-
- Logging is controlled by following global variables:
- - @var kdump_stdloglvl - logging level to standard error (console output)
- - @var kdump_sysloglvl - logging level to syslog (by logger command)
- - @var kdump_kmsgloglvl - logging level to /dev/kmsg (only for boot-time)
- If any of the variables is not set, this function set it to default:
- - @var kdump_stdloglvl=4 (info)
- - @var kdump_sysloglvl=4 (info)
- - @var kdump_kmsgloglvl=0 (no logging)
+ You can configure the kdump log level in the /etc/sysconfig/kdump.
+ For example:
+
+ kdump_sysloglvl=4
+ kdump_stdloglvl=4
+
+ The above configurations indicate that kdump messages will be printed to the
+ console and journald if the journald service is enabled, and the log level is
+ set to 4(info). This is also the current default log level.
Logging levels: fatal(1),error(2),warn(3),info(4),debug(5),trace(6)
- We can easily configure the above variables in the /etc/sysconfig/kdump. For
- example:
- kdump_sysloglvl=5
- kdump_stdloglvl=5
+ The FATAL level designates very severe error events that will presumably lead
+ the application to abort.
- The above configurations indicate that kdump messages will be printed to the
- console and journald if the journald service is enabled.
+ The ERROR level designates error events that might still allow the application
+ to continue running.
+
+ The WARN level designates potentially harmful situations.
+
+ The INFO level designates informational messages that highlight the progress
+ of the application at coarse-grained level.
+
+ The DEBUG level designates fine-grained informational events that are most
+ useful to debug an application.
+
+ The TRACE level designates finer-grained informational events than the DEBUG.
+
+ Currently, the logger works in both the first kernel(kdump service debugging)
+ and the second kernel.
+
+ In the first kernel, you can find the historical logs in the /var/log/messages
+ or use the journalctl command to check kdump service debugging information. In
+ addition, the 'kexec -d' debugging messages are also saved to /var/log/kdump.log
+ in the first kernel.
+
+ In the second kernel, put the kexec-dmesg.log to a same directory with the
+ vmcore, the log file includes the debugging messages like dmesg and journald
+ logs.
+
+ For more details, please refer to the /etc/sysconfig/kdump.
--
2.17.1
3 years, 4 months