import kexec-tools-2.0.20-46.el8
This commit is contained in:
parent
44d9734f29
commit
523401d3d4
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,3 +1,3 @@
|
||||
SOURCES/1.6.8.tar.gz
|
||||
SOURCES/eppic_050615.tar.gz
|
||||
SOURCES/kexec-tools-2.0.20.tar.xz
|
||||
SOURCES/makedumpfile-1.6.7.tar.gz
|
||||
|
@ -1,3 +1,3 @@
|
||||
7af5b92c69df9f63b9f02ad07a76a2a2581d4660 SOURCES/1.6.8.tar.gz
|
||||
a096c8e0892b559f40b01916aae240652f75b68a SOURCES/eppic_050615.tar.gz
|
||||
5d9acd2e741d356d4a48fe4f2d63f66ba431051d SOURCES/kexec-tools-2.0.20.tar.xz
|
||||
42941a0219d57d99909616778835e5d9ba890711 SOURCES/makedumpfile-1.6.7.tar.gz
|
||||
|
30
SOURCES/60-kdump.install
Executable file
30
SOURCES/60-kdump.install
Executable file
@ -0,0 +1,30 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
COMMAND="$1"
|
||||
KERNEL_VERSION="$2"
|
||||
BOOT_DIR_ABS="$3"
|
||||
KERNEL_IMAGE="$4"
|
||||
|
||||
if ! [[ ${KERNEL_INSTALL_MACHINE_ID-x} ]]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [[ -d "$BOOT_DIR_ABS" ]]; then
|
||||
KDUMP_INITRD="initrdkdump"
|
||||
else
|
||||
BOOT_DIR_ABS="/boot"
|
||||
KDUMP_INITRD="initramfs-${KERNEL_VERSION}kdump.img"
|
||||
fi
|
||||
|
||||
ret=0
|
||||
case "$COMMAND" in
|
||||
add)
|
||||
# Do nothing, kdump initramfs is strictly host only
|
||||
# and managed by kdump service
|
||||
;;
|
||||
remove)
|
||||
rm -f -- "$BOOT_DIR_ABS/$KDUMP_INITRD"
|
||||
ret=$?
|
||||
;;
|
||||
esac
|
||||
exit $ret
|
@ -1,7 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
. /etc/sysconfig/kdump
|
||||
. /lib/kdump/kdump-lib.sh
|
||||
|
||||
KDUMP_KERNEL=""
|
||||
KDUMP_INITRD=""
|
||||
@ -21,6 +20,8 @@ depends() {
|
||||
}
|
||||
|
||||
prepare_kernel_initrd() {
|
||||
. /lib/kdump/kdump-lib.sh
|
||||
|
||||
prepare_kdump_bootinfo
|
||||
|
||||
# $kernel is a variable from dracut
|
||||
@ -48,7 +49,10 @@ install() {
|
||||
inst_simple "/etc/sysconfig/kdump"
|
||||
inst_binary "/usr/sbin/kexec"
|
||||
inst_binary "/usr/bin/gawk" "/usr/bin/awk"
|
||||
inst_binary "/usr/bin/logger" "/usr/bin/logger"
|
||||
inst_binary "/usr/bin/printf" "/usr/bin/printf"
|
||||
inst_script "/lib/kdump/kdump-lib.sh" "/lib/kdump-lib.sh"
|
||||
inst_script "/lib/kdump/kdump-logger.sh" "/lib/kdump-logger.sh"
|
||||
inst_hook cmdline 00 "$moddir/early-kdump.sh"
|
||||
inst_binary "$KDUMP_KERNEL"
|
||||
inst_binary "$KDUMP_INITRD"
|
||||
|
@ -12,6 +12,14 @@ EARLY_KEXEC_ARGS=""
|
||||
. /etc/sysconfig/kdump
|
||||
. /lib/dracut-lib.sh
|
||||
. /lib/kdump-lib.sh
|
||||
. /lib/kdump-logger.sh
|
||||
|
||||
#initiate the kdump logger
|
||||
dlog_init
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "failed to initiate the kdump logger."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
prepare_parameters()
|
||||
{
|
||||
@ -28,7 +36,7 @@ early_kdump_load()
|
||||
fi
|
||||
|
||||
if is_fadump_capable; then
|
||||
echo "WARNING: early kdump doesn't support fadump."
|
||||
dwarn "WARNING: early kdump doesn't support fadump."
|
||||
return 1
|
||||
fi
|
||||
|
||||
@ -42,18 +50,25 @@ early_kdump_load()
|
||||
EARLY_KEXEC_ARGS=$(prepare_kexec_args "${KEXEC_ARGS}")
|
||||
|
||||
if is_secure_boot_enforced; then
|
||||
echo "Secure Boot is enabled. Using kexec file based syscall."
|
||||
dinfo "Secure Boot is enabled. Using kexec file based syscall."
|
||||
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"
|
||||
|
||||
$KEXEC ${EARLY_KEXEC_ARGS} $standard_kexec_args \
|
||||
--command-line="$EARLY_KDUMP_CMDLINE" \
|
||||
--initrd=$EARLY_KDUMP_INITRD $EARLY_KDUMP_KERNEL
|
||||
if [ $? == 0 ]; then
|
||||
echo "kexec: loaded early-kdump kernel"
|
||||
dinfo "kexec: loaded early-kdump kernel"
|
||||
return 0
|
||||
else
|
||||
echo "kexec: failed to load early-kdump kernel"
|
||||
derror "kexec: failed to load early-kdump kernel"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
@ -61,10 +76,10 @@ early_kdump_load()
|
||||
set_early_kdump()
|
||||
{
|
||||
if getargbool 0 rd.earlykdump; then
|
||||
echo "early-kdump is enabled."
|
||||
dinfo "early-kdump is enabled."
|
||||
early_kdump_load
|
||||
else
|
||||
echo "early-kdump is disabled."
|
||||
dinfo "early-kdump is disabled."
|
||||
fi
|
||||
|
||||
return 0
|
||||
|
@ -5,7 +5,6 @@ if [ -f /etc/fadump.initramfs ] && [ ! -f /proc/device-tree/rtas/ibm,kernel-dump
|
||||
exit 0
|
||||
fi
|
||||
|
||||
exec &> /dev/console
|
||||
. /lib/dracut-lib.sh
|
||||
. /lib/kdump-lib-initramfs.sh
|
||||
|
||||
@ -22,7 +21,7 @@ do_dump()
|
||||
_ret=$?
|
||||
|
||||
if [ $_ret -ne 0 ]; then
|
||||
echo "kdump: saving vmcore failed"
|
||||
derror "saving vmcore failed"
|
||||
fi
|
||||
|
||||
return $_ret
|
||||
@ -36,7 +35,7 @@ do_kdump_pre()
|
||||
"$KDUMP_PRE"
|
||||
_ret=$?
|
||||
if [ $_ret -ne 0 ]; then
|
||||
echo "kdump: $KDUMP_PRE exited with $_ret status"
|
||||
derror "$KDUMP_PRE exited with $_ret status"
|
||||
return $_ret
|
||||
fi
|
||||
fi
|
||||
@ -47,7 +46,7 @@ do_kdump_pre()
|
||||
"$file"
|
||||
_ret=$?
|
||||
if [ $_ret -ne 0 ]; then
|
||||
echo "kdump: $file exited with $_ret status"
|
||||
derror "$file exited with $_ret status"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
@ -63,7 +62,7 @@ do_kdump_post()
|
||||
"$file" "$1"
|
||||
_ret=$?
|
||||
if [ $_ret -ne 0 ]; then
|
||||
echo "kdump: $file exited with $_ret status"
|
||||
derror "$file exited with $_ret status"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
@ -72,7 +71,7 @@ do_kdump_post()
|
||||
"$KDUMP_POST" "$1"
|
||||
_ret=$?
|
||||
if [ $_ret -ne 0 ]; then
|
||||
echo "kdump: $KDUMP_POST exited with $_ret status"
|
||||
derror "$KDUMP_POST exited with $_ret status"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
@ -88,7 +87,7 @@ dump_raw()
|
||||
|
||||
[ -b "$_raw" ] || return 1
|
||||
|
||||
echo "kdump: saving to raw disk $_raw"
|
||||
dinfo "saving to raw disk $_raw"
|
||||
|
||||
if ! $(echo -n $CORE_COLLECTOR|grep -q makedumpfile); then
|
||||
_src_size=`ls -l /proc/vmcore | cut -d' ' -f5`
|
||||
@ -96,21 +95,25 @@ dump_raw()
|
||||
monitor_dd_progress $_src_size_mb &
|
||||
fi
|
||||
|
||||
echo "kdump: saving vmcore"
|
||||
dinfo "saving vmcore"
|
||||
$CORE_COLLECTOR /proc/vmcore | dd of=$_raw bs=$DD_BLKSIZE >> /tmp/dd_progress_file 2>&1 || return 1
|
||||
sync
|
||||
|
||||
echo "kdump: saving vmcore complete"
|
||||
dinfo "saving vmcore complete"
|
||||
return 0
|
||||
}
|
||||
|
||||
dump_ssh()
|
||||
{
|
||||
local _ret=0
|
||||
local _exitcode=0 _exitcode2=0
|
||||
local _opt="-i $1 -o BatchMode=yes -o StrictHostKeyChecking=yes"
|
||||
local _dir="$KDUMP_PATH/$HOST_IP-$DATEDIR"
|
||||
local _host=$2
|
||||
local _vmcore="vmcore"
|
||||
local _ipv6_addr="" _username=""
|
||||
|
||||
echo "kdump: saving to $_host:$_dir"
|
||||
dinfo "saving to $_host:$_dir"
|
||||
|
||||
cat /var/lib/random-seed > /dev/urandom
|
||||
ssh -q $_opt $_host mkdir -p $_dir || return 1
|
||||
@ -118,17 +121,54 @@ dump_ssh()
|
||||
save_vmcore_dmesg_ssh ${DMESG_COLLECTOR} ${_dir} "${_opt}" $_host
|
||||
save_opalcore_ssh ${_dir} "${_opt}" $_host
|
||||
|
||||
echo "kdump: saving vmcore"
|
||||
dinfo "saving vmcore"
|
||||
|
||||
if [ "${CORE_COLLECTOR%%[[:blank:]]*}" = "scp" ]; then
|
||||
scp -q $_opt /proc/vmcore "$_host:$_dir/vmcore-incomplete" || return 1
|
||||
ssh $_opt $_host "mv $_dir/vmcore-incomplete $_dir/vmcore" || return 1
|
||||
else
|
||||
$CORE_COLLECTOR /proc/vmcore | ssh $_opt $_host "dd bs=512 of=$_dir/vmcore-incomplete" || return 1
|
||||
ssh $_opt $_host "mv $_dir/vmcore-incomplete $_dir/vmcore.flat" || return 1
|
||||
if is_ipv6_address "$_host"; then
|
||||
_username=${_host%@*}
|
||||
_ipv6_addr="[${_host#*@}]"
|
||||
fi
|
||||
|
||||
if [ "${CORE_COLLECTOR%%[[:blank:]]*}" = "scp" ]; then
|
||||
if [ -n "$_username" ] && [ -n "$_ipv6_addr" ]; then
|
||||
scp -q $_opt /proc/vmcore "$_username@$_ipv6_addr:$_dir/vmcore-incomplete"
|
||||
else
|
||||
scp -q $_opt /proc/vmcore "$_host:$_dir/vmcore-incomplete"
|
||||
fi
|
||||
_exitcode=$?
|
||||
else
|
||||
$CORE_COLLECTOR /proc/vmcore | ssh $_opt $_host "dd bs=512 of=$_dir/vmcore-incomplete"
|
||||
_exitcode=$?
|
||||
_vmcore="vmcore.flat"
|
||||
fi
|
||||
|
||||
if [ $_exitcode -eq 0 ]; then
|
||||
ssh $_opt $_host "mv $_dir/vmcore-incomplete $_dir/$_vmcore"
|
||||
_exitcode2=$?
|
||||
if [ $_exitcode2 -ne 0 ]; then
|
||||
derror "moving vmcore failed, _exitcode:$_exitcode2"
|
||||
else
|
||||
dinfo "saving vmcore complete"
|
||||
fi
|
||||
else
|
||||
derror "saving vmcore failed, _exitcode:$_exitcode"
|
||||
fi
|
||||
|
||||
dinfo "saving the $KDUMP_LOG_FILE to $_host:$_dir/"
|
||||
save_log
|
||||
if [ -n "$_username" ] && [ -n "$_ipv6_addr" ]; then
|
||||
scp -q $_opt $KDUMP_LOG_FILE "$_username@$_ipv6_addr:$_dir/"
|
||||
else
|
||||
scp -q $_opt $KDUMP_LOG_FILE "$_host:$_dir/"
|
||||
fi
|
||||
_ret=$?
|
||||
if [ $_ret -ne 0 ]; then
|
||||
derror "saving log file failed, _exitcode:$_ret"
|
||||
fi
|
||||
|
||||
if [ $_exitcode -ne 0 ] || [ $_exitcode2 -ne 0 ];then
|
||||
return 1
|
||||
fi
|
||||
|
||||
echo "kdump: saving vmcore complete"
|
||||
return 0
|
||||
}
|
||||
|
||||
@ -136,6 +176,9 @@ save_opalcore_ssh() {
|
||||
local _path=$1
|
||||
local _opts="$2"
|
||||
local _location=$3
|
||||
local _user_name="" _ipv6addr=""
|
||||
|
||||
ddebug "_path=$_path _opts=$_opts _location=$_location"
|
||||
|
||||
if [ ! -f $OPALCORE ]; then
|
||||
# Check if we are on an old kernel that uses a different path
|
||||
@ -146,15 +189,25 @@ save_opalcore_ssh() {
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "kdump: saving opalcore"
|
||||
scp $_opts $OPALCORE $_location:$_path/opalcore-incomplete
|
||||
if is_ipv6_address "$_host"; then
|
||||
_user_name=${_location%@*}
|
||||
_ipv6addr="[${_location#*@}]"
|
||||
fi
|
||||
|
||||
dinfo "saving opalcore:$OPALCORE to $_location:$_path"
|
||||
|
||||
if [ -n "$_user_name" ] && [ -n "$_ipv6addr" ]; then
|
||||
scp $_opts $OPALCORE $_user_name@$_ipv6addr:$_path/opalcore-incomplete
|
||||
else
|
||||
scp $_opts $OPALCORE $_location:$_path/opalcore-incomplete
|
||||
fi
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "kdump: saving opalcore failed"
|
||||
derror "saving opalcore failed"
|
||||
return 1
|
||||
fi
|
||||
|
||||
ssh $_opts $_location mv $_path/opalcore-incomplete $_path/opalcore
|
||||
echo "kdump: saving opalcore complete"
|
||||
dinfo "saving opalcore complete"
|
||||
return 0
|
||||
}
|
||||
|
||||
@ -164,15 +217,15 @@ save_vmcore_dmesg_ssh() {
|
||||
local _opts="$3"
|
||||
local _location=$4
|
||||
|
||||
echo "kdump: saving vmcore-dmesg.txt"
|
||||
dinfo "saving vmcore-dmesg.txt to $_location:$_path"
|
||||
$_dmesg_collector /proc/vmcore | ssh $_opts $_location "dd of=$_path/vmcore-dmesg-incomplete.txt"
|
||||
_exitcode=$?
|
||||
|
||||
if [ $_exitcode -eq 0 ]; then
|
||||
ssh -q $_opts $_location mv $_path/vmcore-dmesg-incomplete.txt $_path/vmcore-dmesg.txt
|
||||
echo "kdump: saving vmcore-dmesg.txt complete"
|
||||
dinfo "saving vmcore-dmesg.txt complete"
|
||||
else
|
||||
echo "kdump: saving vmcore-dmesg.txt failed"
|
||||
derror "saving vmcore-dmesg.txt failed"
|
||||
fi
|
||||
}
|
||||
|
||||
@ -182,12 +235,12 @@ get_host_ip()
|
||||
if is_nfs_dump_target || is_ssh_dump_target
|
||||
then
|
||||
kdumpnic=$(getarg kdumpnic=)
|
||||
[ -z "$kdumpnic" ] && echo "kdump: failed to get kdumpnic!" && return 1
|
||||
[ -z "$kdumpnic" ] && derror "failed to get kdumpnic!" && return 1
|
||||
_host=`ip addr show dev $kdumpnic|grep '[ ]*inet'`
|
||||
[ $? -ne 0 ] && echo "kdump: wrong kdumpnic: $kdumpnic" && return 1
|
||||
[ $? -ne 0 ] && derror "wrong kdumpnic: $kdumpnic" && return 1
|
||||
_host=`echo $_host | head -n 1 | cut -d' ' -f2`
|
||||
_host="${_host%%/*}"
|
||||
[ -z "$_host" ] && echo "kdump: wrong kdumpnic: $kdumpnic" && return 1
|
||||
[ -z "$_host" ] && derror "wrong kdumpnic: $kdumpnic" && return 1
|
||||
HOST_IP=$_host
|
||||
fi
|
||||
return 0
|
||||
@ -196,7 +249,7 @@ get_host_ip()
|
||||
read_kdump_conf()
|
||||
{
|
||||
if [ ! -f "$KDUMP_CONF" ]; then
|
||||
echo "kdump: $KDUMP_CONF not found"
|
||||
derror "$KDUMP_CONF not found"
|
||||
return
|
||||
fi
|
||||
|
||||
@ -240,7 +293,7 @@ fence_kdump_notify
|
||||
|
||||
get_host_ip
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "kdump: get_host_ip exited with non-zero status!"
|
||||
derror "get_host_ip exited with non-zero status!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
@ -250,7 +303,7 @@ fi
|
||||
|
||||
do_kdump_pre
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "kdump: kdump_pre script exited with non-zero status!"
|
||||
derror "kdump_pre script exited with non-zero status!"
|
||||
do_final_action
|
||||
# During systemd service to reboot the machine, stop this shell script running
|
||||
exit 1
|
||||
@ -261,7 +314,7 @@ DUMP_RETVAL=$?
|
||||
|
||||
do_kdump_post $DUMP_RETVAL
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "kdump: kdump_post script exited with non-zero status!"
|
||||
derror "kdump_post script exited with non-zero status!"
|
||||
fi
|
||||
|
||||
if [ $DUMP_RETVAL -ne 0 ]; then
|
||||
|
@ -1,11 +1,12 @@
|
||||
#!/bin/bash
|
||||
|
||||
. $dracutfunctions
|
||||
. /lib/kdump/kdump-lib.sh
|
||||
kdump_module_init() {
|
||||
if ! [[ -d "${initdir}/tmp" ]]; then
|
||||
mkdir -p "${initdir}/tmp"
|
||||
fi
|
||||
|
||||
if ! [[ -d "${initdir}/tmp" ]]; then
|
||||
mkdir -p "${initdir}/tmp"
|
||||
fi
|
||||
. /lib/kdump/kdump-lib.sh
|
||||
}
|
||||
|
||||
check() {
|
||||
[[ $debug ]] && set -x
|
||||
@ -20,6 +21,12 @@ check() {
|
||||
depends() {
|
||||
local _dep="base shutdown"
|
||||
|
||||
kdump_module_init
|
||||
|
||||
add_opt_module() {
|
||||
[[ " $omit_dracutmodules " != *\ $1\ * ]] && _dep="$_dep $1"
|
||||
}
|
||||
|
||||
is_squash_available() {
|
||||
for kmodule in squashfs overlay loop; do
|
||||
if [ -z "$KDUMP_KERNELVER" ]; then
|
||||
@ -31,13 +38,26 @@ depends() {
|
||||
}
|
||||
|
||||
if is_squash_available && ! is_fadump_capable; then
|
||||
_dep="$_dep squash"
|
||||
add_opt_module squash
|
||||
else
|
||||
dwarning "Required modules to build a squashed kdump image is missing!"
|
||||
fi
|
||||
|
||||
add_opt_module watchdog-modules
|
||||
if is_wdt_active; then
|
||||
add_opt_module watchdog
|
||||
fi
|
||||
|
||||
if is_ssh_dump_target; then
|
||||
_dep="$_dep ssh-client"
|
||||
fi
|
||||
|
||||
if [ "$(uname -m)" = "s390x" ]; then
|
||||
_dep="$_dep znet"
|
||||
fi
|
||||
|
||||
if [ -n "$( find /sys/devices -name drm )" ] || [ -d /sys/module/hyperv_fb ]; then
|
||||
_dep="$_dep drm"
|
||||
add_opt_module drm
|
||||
fi
|
||||
|
||||
if is_generic_fence_kdump || is_pcs_fence_kdump; then
|
||||
@ -45,7 +65,6 @@ depends() {
|
||||
fi
|
||||
|
||||
echo $_dep
|
||||
return 0
|
||||
}
|
||||
|
||||
kdump_is_bridge() {
|
||||
@ -244,14 +263,10 @@ kdump_setup_vlan() {
|
||||
local _netmac="$(kdump_get_mac_addr $_phydev)"
|
||||
local _kdumpdev
|
||||
|
||||
#Just support vlan over bond, it is not easy
|
||||
#to support all other complex setup
|
||||
#Just support vlan over bond and team
|
||||
if kdump_is_bridge "$_phydev"; then
|
||||
derror "Vlan over bridge is not supported!"
|
||||
exit 1
|
||||
elif kdump_is_team "$_phydev"; then
|
||||
derror "Vlan over team is not supported!"
|
||||
exit 1
|
||||
elif kdump_is_bond "$_phydev"; then
|
||||
kdump_setup_bond "$_phydev"
|
||||
echo " vlan=$(kdump_setup_ifname $_netdev):$_phydev" > ${initdir}/etc/cmdline.d/43vlan.conf
|
||||
@ -289,7 +304,7 @@ kdump_setup_netdev() {
|
||||
if [ -n "$_static" ]; then
|
||||
_proto=none
|
||||
elif is_ipv6_address $_srcaddr; then
|
||||
_proto=either6
|
||||
_proto=auto6
|
||||
else
|
||||
_proto=dhcp
|
||||
fi
|
||||
@ -759,9 +774,32 @@ remove_cpu_online_rule() {
|
||||
sed -i '/SUBSYSTEM=="cpu"/d' $file
|
||||
}
|
||||
|
||||
kdump_install_systemd_conf() {
|
||||
local failure_action=$(get_option_value "failure_action")
|
||||
|
||||
# Kdump turns out to require longer default systemd mount timeout
|
||||
# than 1st kernel(90s by default), we use default 300s for kdump.
|
||||
grep -r "^[[:space:]]*DefaultTimeoutStartSec=" ${initdir}/etc/systemd/system.conf* &>/dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
mkdir -p ${initdir}/etc/systemd/system.conf.d
|
||||
echo "[Manager]" > ${initdir}/etc/systemd/system.conf.d/kdump.conf
|
||||
echo "DefaultTimeoutStartSec=300s" >> ${initdir}/etc/systemd/system.conf.d/kdump.conf
|
||||
fi
|
||||
|
||||
# Forward logs to console directly, and don't read Kmsg, this avoids
|
||||
# unneccessary memory consumption and make console output more useful.
|
||||
# Only do so for non fadump image.
|
||||
mkdir -p ${initdir}/etc/systemd/journald.conf.d
|
||||
echo "[Journal]" > ${initdir}/etc/systemd/journald.conf.d/kdump.conf
|
||||
echo "Storage=volatile" >> ${initdir}/etc/systemd/journald.conf.d/kdump.conf
|
||||
echo "ReadKMsg=no" >> ${initdir}/etc/systemd/journald.conf.d/kdump.conf
|
||||
echo "ForwardToConsole=yes" >> ${initdir}/etc/systemd/journald.conf.d/kdump.conf
|
||||
}
|
||||
|
||||
install() {
|
||||
local arch
|
||||
|
||||
kdump_module_init
|
||||
kdump_install_conf
|
||||
remove_sysctl_conf
|
||||
|
||||
@ -789,11 +827,14 @@ install() {
|
||||
inst "/bin/head" "/bin/head"
|
||||
inst "/sbin/makedumpfile" "/sbin/makedumpfile"
|
||||
inst "/sbin/vmcore-dmesg" "/sbin/vmcore-dmesg"
|
||||
inst "/usr/bin/printf" "/sbin/printf"
|
||||
inst "/usr/bin/logger" "/sbin/logger"
|
||||
inst "/lib/kdump/kdump-lib.sh" "/lib/kdump-lib.sh"
|
||||
inst "/lib/kdump/kdump-lib-initramfs.sh" "/lib/kdump-lib-initramfs.sh"
|
||||
inst "/lib/kdump/kdump-logger.sh" "/lib/kdump-logger.sh"
|
||||
inst "$moddir/kdump.sh" "/usr/bin/kdump.sh"
|
||||
inst "$moddir/kdump-capture.service" "$systemdsystemunitdir/kdump-capture.service"
|
||||
ln_r "$systemdsystemunitdir/kdump-capture.service" "$systemdsystemunitdir/initrd.target.wants/kdump-capture.service"
|
||||
systemctl -q --root "$initdir" add-wants initrd.target kdump-capture.service
|
||||
inst "$moddir/kdump-error-handler.sh" "/usr/bin/kdump-error-handler.sh"
|
||||
inst "$moddir/kdump-error-handler.service" "$systemdsystemunitdir/kdump-error-handler.service"
|
||||
# Replace existing emergency service and emergency target
|
||||
@ -807,6 +848,8 @@ install() {
|
||||
# at some point of time.
|
||||
kdump_check_iscsi_targets
|
||||
|
||||
kdump_install_systemd_conf
|
||||
|
||||
# For the lvm type target under kdump, in /etc/lvm/lvm.conf we can
|
||||
# safely replace "reserved_memory=XXXX"(default value is 8192) with
|
||||
# "reserved_memory=1024" to lower memory pressure under kdump. We do
|
||||
@ -816,25 +859,8 @@ install() {
|
||||
's/\(^[[:space:]]*reserved_memory[[:space:]]*=\)[[:space:]]*[[:digit:]]*/\1 1024/' \
|
||||
${initdir}/etc/lvm/lvm.conf &>/dev/null
|
||||
|
||||
# Kdump turns out to require longer default systemd mount timeout
|
||||
# than 1st kernel(90s by default), we use default 300s for kdump.
|
||||
grep -r "^[[:space:]]*DefaultTimeoutStartSec=" ${initdir}/etc/systemd/system.conf* &>/dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
mkdir -p ${initdir}/etc/systemd/system.conf.d
|
||||
echo "[Manager]" > ${initdir}/etc/systemd/system.conf.d/kdump.conf
|
||||
echo "DefaultTimeoutStartSec=300s" >> ${initdir}/etc/systemd/system.conf.d/kdump.conf
|
||||
fi
|
||||
|
||||
# Save more memory by dropping switch root capability
|
||||
if ! is_fadump_capable; then
|
||||
# Forward logs to console directly, this avoids unneccessary memory
|
||||
# consumption and make console output more useful.
|
||||
# Only do so for non fadump image.
|
||||
mkdir -p ${initdir}/etc/systemd/journald.conf.d
|
||||
echo "[Journal]" > ${initdir}/etc/systemd/journald.conf.d/kdump.conf
|
||||
echo "Storage=none" >> ${initdir}/etc/systemd/journald.conf.d/kdump.conf
|
||||
echo "ForwardToConsole=yes" >> ${initdir}/etc/systemd/journald.conf.d/kdump.conf
|
||||
|
||||
# Save more memory by dropping switch root capability
|
||||
dracut_no_switch_root
|
||||
fi
|
||||
}
|
||||
|
@ -104,6 +104,11 @@ For the recommended value of X, see 'FADump Memory Requirements' section.
|
||||
|
||||
# grubby --args="fadump=on crashkernel=6G" --update-kernel=/boot/vmlinuz-`uname -r`
|
||||
|
||||
By default, FADump reserved memory will be initialized as CMA area to make the
|
||||
memory available through CMA allocator on the production kernel. We can opt out
|
||||
of this, making reserved memory unavailable to production kernel, by booting the
|
||||
linux kernel with 'fadump=nocma' instead of 'fadump=on'.
|
||||
|
||||
The term 'boot memory' means size of the low memory chunk that is required for
|
||||
a kernel to boot successfully when booted with restricted memory. By default,
|
||||
the boot memory size will be the larger of 5% of system RAM or 256MB.
|
||||
@ -326,9 +331,14 @@ the original command line completely.
|
||||
|
||||
How to disable FADump:
|
||||
|
||||
Remove "fadump=on" from kernel cmdline parameters:
|
||||
Remove "fadump=on"/"fadump=nocma" from kernel cmdline parameters OR replace
|
||||
it with "fadump=off" kernel cmdline parameter:
|
||||
|
||||
# grubby --update-kernel=/boot/vmlinuz-`uname -r` --remove-args="fadump=on"
|
||||
or
|
||||
# grubby --update-kernel=/boot/vmlinuz-`uname -r` --remove-args="fadump=nocma"
|
||||
OR
|
||||
# grubby --update-kernel=/boot/vmlinuz-`uname -r` --args="fadump=off"
|
||||
|
||||
If KDump is to be used as the dump capturing mechanism, update the crashkernel
|
||||
parameter (Else, remove "crashkernel=" parameter too, using grubby):
|
||||
|
@ -4,6 +4,7 @@
|
||||
# http://www.freedesktop.org/wiki/Software/systemd/Generators/
|
||||
|
||||
. /usr/lib/kdump/kdump-lib.sh
|
||||
. /usr/lib/kdump/kdump-logger.sh
|
||||
|
||||
# If invokded with no arguments for testing purpose, output to /tmp to
|
||||
# avoid overriding the existing.
|
||||
|
@ -1,10 +1,12 @@
|
||||
# These variables and functions are useful in 2nd kernel
|
||||
|
||||
. /lib/kdump-lib.sh
|
||||
. /lib/kdump-logger.sh
|
||||
|
||||
KDUMP_PATH="/var/crash"
|
||||
KDUMP_LOG_FILE="/run/initramfs/kexec-dmesg.log"
|
||||
CORE_COLLECTOR=""
|
||||
DEFAULT_CORE_COLLECTOR="makedumpfile -l --message-level 1 -d 31"
|
||||
DEFAULT_CORE_COLLECTOR="makedumpfile -l --message-level 7 -d 31"
|
||||
DMESG_COLLECTOR="/sbin/vmcore-dmesg"
|
||||
FAILURE_ACTION="systemctl reboot -f"
|
||||
DATEDIR=`date +%Y-%m-%d-%T`
|
||||
@ -20,6 +22,13 @@ KDUMP_POST=""
|
||||
NEWROOT="/sysroot"
|
||||
OPALCORE="/sys/firmware/opal/mpipl/core"
|
||||
|
||||
#initiate the kdump logger
|
||||
dlog_init
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "failed to initiate the kdump logger."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
get_kdump_confs()
|
||||
{
|
||||
local config_opt config_val
|
||||
@ -94,34 +103,36 @@ get_kdump_confs()
|
||||
fi
|
||||
}
|
||||
|
||||
# store the kexec kernel log to a file.
|
||||
save_log()
|
||||
{
|
||||
dmesg -T > $KDUMP_LOG_FILE
|
||||
|
||||
if command -v journalctl > /dev/null; then
|
||||
journalctl -ab >> $KDUMP_LOG_FILE
|
||||
fi
|
||||
}
|
||||
|
||||
# dump_fs <mount point>
|
||||
dump_fs()
|
||||
{
|
||||
local _exitcode
|
||||
local _mp=$1
|
||||
local _dev=$(get_mount_info SOURCE target $_mp -f)
|
||||
local _op=$(get_mount_info OPTIONS target $_mp -f)
|
||||
ddebug "dump_fs _mp=$_mp"
|
||||
|
||||
# If dump path have a corresponding device entry but not mounted, mount it.
|
||||
if [ -n "$_dev" ] || [ "$_dev" == "rootfs" ]; then
|
||||
if ! is_mounted "$_mp"; then
|
||||
echo "kdump: dump target $_dev is not mounted, trying to mount..."
|
||||
mkdir -p $_mp
|
||||
mount -o $_op $_dev $_mp
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "kdump: mounting failed (mount point: $_mp, option: $_op)"
|
||||
return 1
|
||||
fi
|
||||
if ! is_mounted "$_mp"; then
|
||||
dinfo "dump path \"$_mp\" is not mounted, trying to mount..."
|
||||
mount --target $_mp
|
||||
if [ $? -ne 0 ]; then
|
||||
derror "failed to dump to \"$_mp\", it's not a mount point!"
|
||||
return 1
|
||||
fi
|
||||
else
|
||||
echo "kdump: failed to dump to \"$_mp\", it's not a mount point!"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Remove -F in makedumpfile case. We don't want a flat format dump here.
|
||||
[[ $CORE_COLLECTOR = *makedumpfile* ]] && CORE_COLLECTOR=`echo $CORE_COLLECTOR | sed -e "s/-F//g"`
|
||||
|
||||
echo "kdump: saving to $_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/"
|
||||
dinfo "saving to $_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/"
|
||||
|
||||
mount -o remount,rw $_mp || return 1
|
||||
mkdir -p $_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR || return 1
|
||||
@ -129,12 +140,23 @@ dump_fs()
|
||||
save_vmcore_dmesg_fs ${DMESG_COLLECTOR} "$_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/"
|
||||
save_opalcore_fs "$_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/"
|
||||
|
||||
echo "kdump: saving vmcore"
|
||||
$CORE_COLLECTOR /proc/vmcore $_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/vmcore-incomplete || return 1
|
||||
mv $_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/vmcore-incomplete $_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/vmcore
|
||||
sync
|
||||
dinfo "saving vmcore"
|
||||
$CORE_COLLECTOR /proc/vmcore $_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/vmcore-incomplete
|
||||
_exitcode=$?
|
||||
if [ $_exitcode -eq 0 ]; then
|
||||
mv $_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/vmcore-incomplete $_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/vmcore
|
||||
sync
|
||||
dinfo "saving vmcore complete"
|
||||
else
|
||||
derror "saving vmcore failed, _exitcode:$_exitcode"
|
||||
fi
|
||||
|
||||
echo "kdump: saving vmcore complete"
|
||||
dinfo "saving the $KDUMP_LOG_FILE to $_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/"
|
||||
save_log
|
||||
mv $KDUMP_LOG_FILE $_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/
|
||||
if [ $_exitcode -ne 0 ]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
# improper kernel cmdline can cause the failure of echo, we can ignore this kind of failure
|
||||
return 0
|
||||
@ -144,7 +166,7 @@ save_vmcore_dmesg_fs() {
|
||||
local _dmesg_collector=$1
|
||||
local _path=$2
|
||||
|
||||
echo "kdump: saving vmcore-dmesg.txt"
|
||||
dinfo "saving vmcore-dmesg.txt to ${_path}"
|
||||
$_dmesg_collector /proc/vmcore > ${_path}/vmcore-dmesg-incomplete.txt
|
||||
_exitcode=$?
|
||||
if [ $_exitcode -eq 0 ]; then
|
||||
@ -154,9 +176,9 @@ save_vmcore_dmesg_fs() {
|
||||
# saving vmcore failed and system rebooted without sync and there
|
||||
# was no vmcore-dmesg.txt available.
|
||||
sync
|
||||
echo "kdump: saving vmcore-dmesg.txt complete"
|
||||
dinfo "saving vmcore-dmesg.txt complete"
|
||||
else
|
||||
echo "kdump: saving vmcore-dmesg.txt failed"
|
||||
derror "saving vmcore-dmesg.txt failed"
|
||||
fi
|
||||
}
|
||||
|
||||
@ -172,43 +194,47 @@ save_opalcore_fs() {
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "kdump: saving opalcore"
|
||||
dinfo "saving opalcore:$OPALCORE to ${_path}/opalcore"
|
||||
cp $OPALCORE ${_path}/opalcore
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "kdump: saving opalcore failed"
|
||||
derror "saving opalcore failed"
|
||||
return 1
|
||||
fi
|
||||
|
||||
sync
|
||||
echo "kdump: saving opalcore complete"
|
||||
dinfo "saving opalcore complete"
|
||||
return 0
|
||||
}
|
||||
|
||||
dump_to_rootfs()
|
||||
{
|
||||
|
||||
echo "Kdump: trying to bring up rootfs device"
|
||||
dinfo "Trying to bring up rootfs device"
|
||||
systemctl start dracut-initqueue
|
||||
echo "Kdump: waiting for rootfs mount, will timeout after 90 seconds"
|
||||
dinfo "Waiting for rootfs mount, will timeout after 90 seconds"
|
||||
systemctl start sysroot.mount
|
||||
|
||||
ddebug "NEWROOT=$NEWROOT"
|
||||
|
||||
dump_fs $NEWROOT
|
||||
}
|
||||
|
||||
kdump_emergency_shell()
|
||||
{
|
||||
echo "PS1=\"kdump:\\\${PWD}# \"" >/etc/profile
|
||||
ddebug "Switching to dracut emergency..."
|
||||
/bin/dracut-emergency
|
||||
rm -f /etc/profile
|
||||
}
|
||||
|
||||
do_failure_action()
|
||||
{
|
||||
echo "Kdump: Executing failure action $FAILURE_ACTION"
|
||||
dinfo "Executing failure action $FAILURE_ACTION"
|
||||
eval $FAILURE_ACTION
|
||||
}
|
||||
|
||||
do_final_action()
|
||||
{
|
||||
dinfo "Executing final action $FINAL_ACTION"
|
||||
eval $FINAL_ACTION
|
||||
}
|
||||
|
@ -20,14 +20,10 @@ is_fadump_capable()
|
||||
}
|
||||
|
||||
perror_exit() {
|
||||
echo $@ >&2
|
||||
derror "$@"
|
||||
exit 1
|
||||
}
|
||||
|
||||
perror() {
|
||||
echo $@ >&2
|
||||
}
|
||||
|
||||
is_ssh_dump_target()
|
||||
{
|
||||
grep -q "^ssh[[:blank:]].*@" /etc/kdump.conf
|
||||
@ -463,28 +459,33 @@ get_ifcfg_filename() {
|
||||
echo -n "${ifcfg_file}"
|
||||
}
|
||||
|
||||
# returns 0 when omission of watchdog module is desired in dracut_args
|
||||
# returns 0 when omission of a module is desired in dracut_args
|
||||
# returns 1 otherwise
|
||||
is_wdt_mod_omitted() {
|
||||
local dracut_args
|
||||
local ret=1
|
||||
is_dracut_mod_omitted() {
|
||||
local dracut_args dracut_mod=$1
|
||||
|
||||
dracut_args=$(grep "^dracut_args" /etc/kdump.conf)
|
||||
[[ -z $dracut_args ]] && return $ret
|
||||
set -- $(grep "^dracut_args" /etc/kdump.conf)
|
||||
while [ $# -gt 0 ]; do
|
||||
case $1 in
|
||||
-o|--omit)
|
||||
[[ " ${2//[^[:alnum:]]/ } " == *" $dracut_mod "* ]] && return 0
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
eval set -- $dracut_args
|
||||
while :; do
|
||||
[[ -z $1 ]] && break
|
||||
case $1 in
|
||||
-o|--omit)
|
||||
echo $2 | grep -qw "watchdog"
|
||||
[[ $? == 0 ]] && ret=0
|
||||
break
|
||||
esac
|
||||
shift
|
||||
done
|
||||
return 1
|
||||
}
|
||||
|
||||
return $ret
|
||||
is_wdt_active() {
|
||||
local active
|
||||
|
||||
[ -d /sys/class/watchdog ] || return 1
|
||||
for dir in /sys/class/watchdog/*; do
|
||||
[ -f "$dir/state" ] || continue
|
||||
active=$(< "$dir/state")
|
||||
[ "$active" = "active" ] && return 0
|
||||
done
|
||||
return 1
|
||||
}
|
||||
|
||||
# If "dracut_args" contains "--mount" information, use it
|
||||
@ -513,7 +514,7 @@ check_crash_mem_reserved()
|
||||
|
||||
mem_reserved=$(cat /sys/kernel/kexec_crash_size)
|
||||
if [ $mem_reserved -eq 0 ]; then
|
||||
echo "No memory reserved for crash kernel"
|
||||
derror "No memory reserved for crash kernel"
|
||||
return 1
|
||||
fi
|
||||
|
||||
@ -523,7 +524,7 @@ check_crash_mem_reserved()
|
||||
check_kdump_feasibility()
|
||||
{
|
||||
if [ ! -e /sys/kernel/kexec_crash_loaded ]; then
|
||||
echo "Kdump is not supported on this kernel"
|
||||
derror "Kdump is not supported on this kernel"
|
||||
return 1
|
||||
fi
|
||||
check_crash_mem_reserved
|
||||
@ -533,7 +534,7 @@ check_kdump_feasibility()
|
||||
check_current_kdump_status()
|
||||
{
|
||||
if [ ! -f /sys/kernel/kexec_crash_loaded ];then
|
||||
echo "Perhaps CONFIG_CRASH_DUMP is not enabled in kernel"
|
||||
derror "Perhaps CONFIG_CRASH_DUMP is not enabled in kernel"
|
||||
return 1
|
||||
fi
|
||||
|
||||
@ -616,11 +617,16 @@ is_secure_boot_enforced()
|
||||
local secure_boot_file setup_mode_file
|
||||
local secure_boot_byte setup_mode_byte
|
||||
|
||||
# On powerpc, os-secureboot-enforcing DT property indicates whether secureboot
|
||||
# is enforced. Return success, if it is found.
|
||||
# On powerpc, secure boot is enforced if:
|
||||
# host secure boot: /ibm,secure-boot/os-secureboot-enforcing DT property exists
|
||||
# guest secure boot: /ibm,secure-boot >= 2
|
||||
if [ -f /proc/device-tree/ibm,secureboot/os-secureboot-enforcing ]; then
|
||||
return 0
|
||||
fi
|
||||
if [ -f /proc/device-tree/ibm,secure-boot ] && \
|
||||
[ $(lsprop /proc/device-tree/ibm,secure-boot | tail -1) -ge 2 ]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
# Detect secure boot on x86 and arm64
|
||||
secure_boot_file=$(find /sys/firmware/efi/efivars -name SecureBoot-* 2>/dev/null)
|
||||
@ -661,8 +667,7 @@ prepare_kexec_args()
|
||||
found_elf_args=`echo $kexec_args | grep elf32-core-headers`
|
||||
if [ -n "$found_elf_args" ]
|
||||
then
|
||||
echo -n "Warning: elf32-core-headers overrides correct elf64 setting"
|
||||
echo
|
||||
dwarn "Warning: elf32-core-headers overrides correct elf64 setting"
|
||||
else
|
||||
kexec_args="$kexec_args --elf64-core-headers"
|
||||
fi
|
||||
@ -713,7 +718,7 @@ prepare_kdump_bootinfo()
|
||||
done
|
||||
|
||||
if ! [ -e "$KDUMP_KERNEL" ]; then
|
||||
echo "Failed to detect kdump kernel location"
|
||||
derror "Failed to detect kdump kernel location"
|
||||
return 1
|
||||
fi
|
||||
|
||||
@ -741,6 +746,25 @@ prepare_kdump_bootinfo()
|
||||
fi
|
||||
}
|
||||
|
||||
get_watchdog_drvs()
|
||||
{
|
||||
local _wdtdrvs _drv _dir
|
||||
|
||||
for _dir in /sys/class/watchdog/*; do
|
||||
# device/modalias will return driver of this device
|
||||
[[ -f "$_dir/device/modalias" ]] || continue
|
||||
_drv=$(< "$_dir/device/modalias")
|
||||
_drv=$(modprobe --set-version "$KDUMP_KERNELVER" -R $_drv 2>/dev/null)
|
||||
for i in $_drv; do
|
||||
if ! [[ " $_wdtdrvs " == *" $i "* ]]; then
|
||||
_wdtdrvs="$_wdtdrvs $i"
|
||||
fi
|
||||
done
|
||||
done
|
||||
|
||||
echo $_wdtdrvs
|
||||
}
|
||||
|
||||
#
|
||||
# prepare_cmdline <commandline> <commandline remove> <commandline append>
|
||||
# This function performs a series of edits on the command line.
|
||||
@ -783,12 +807,20 @@ prepare_cmdline()
|
||||
cmdline=$(append_cmdline "${cmdline}" disable_cpu_apicid ${id})
|
||||
fi
|
||||
|
||||
# Disable efifb if hyperv_fb is in use, hyperv_fb will relocate the framebuffer
|
||||
# but kexec_file_load always use original screen_info and in second kernel efifb
|
||||
# will try to access an invalid framebuffer address
|
||||
if [ -d /sys/module/hyperv_fb ]; then
|
||||
cmdline=$(append_cmdline "$cmdline" "video=efifb:off")
|
||||
fi
|
||||
# If any watchdog is used, set it's pretimeout to 0. pretimeout let
|
||||
# watchdog panic the kernel first, and reset the system after the
|
||||
# panic. If the system is already in kdump, panic is not helpful
|
||||
# and only increase the chance of watchdog failure.
|
||||
for i in $(get_watchdog_drvs); do
|
||||
cmdline+=" $i.pretimeout=0"
|
||||
|
||||
if [[ $i == hpwdt ]]; then
|
||||
# hpwdt have a special parameter kdumptimeout, is's only suppose
|
||||
# to be set to non-zero in first kernel. In kdump, non-zero
|
||||
# value could prevent the watchdog from resetting the system.
|
||||
cmdline+=" $i.kdumptimeout=0"
|
||||
fi
|
||||
done
|
||||
|
||||
echo ${cmdline}
|
||||
}
|
||||
|
348
SOURCES/kdump-logger.sh
Executable file
348
SOURCES/kdump-logger.sh
Executable file
@ -0,0 +1,348 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# This comes from the dracut-logger.sh
|
||||
#
|
||||
# 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 (3)
|
||||
# The INFO level designates informational messages that highlight the
|
||||
# progress of the application at coarse-grained level.
|
||||
# - dwarn (2)
|
||||
# The WARN level designates potentially harmful situations.
|
||||
# - derror (1)
|
||||
# The ERROR level designates error events that might still allow the
|
||||
# application to continue running.
|
||||
#
|
||||
# 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, the function dlog_init() sets it to default:
|
||||
# - In the first kernel:
|
||||
# - @var kdump_stdloglvl = 3 (info)
|
||||
# - @var kdump_sysloglvl = 0 (no logging)
|
||||
# - @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!
|
||||
#
|
||||
|
||||
# Define vairables for the log levels in this module.
|
||||
kdump_stdloglvl=""
|
||||
kdump_sysloglvl=""
|
||||
kdump_kmsgloglvl=""
|
||||
|
||||
# The dracut-lib.sh is only available in the second kernel, and it won't
|
||||
# be used in the first kernel because the dracut-lib.sh is invisible in
|
||||
# the first kernel.
|
||||
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.
|
||||
#
|
||||
check_loglvl()
|
||||
{
|
||||
case "$1" in
|
||||
0|1|2|3|4)
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# @brief Initializes Logger.
|
||||
# @retval 1 if something has gone wrong
|
||||
# @retval 0 on success.
|
||||
#
|
||||
dlog_init() {
|
||||
local ret=0; local errmsg
|
||||
|
||||
if [ -s /proc/vmcore ];then
|
||||
get_kdump_loglvl
|
||||
if [ $? -ne 0 ];then
|
||||
logger -t "kdump[$$]" -p warn -- "Kdump is using the default log level(3)."
|
||||
kdump_sysloglvl=3
|
||||
fi
|
||||
kdump_stdloglvl=0
|
||||
kdump_kmsgloglvl=0
|
||||
else
|
||||
kdump_stdloglvl=$KDUMP_STDLOGLVL
|
||||
kdump_sysloglvl=$KDUMP_SYSLOGLVL
|
||||
kdump_kmsgloglvl=$KDUMP_KMSGLOGLVL
|
||||
fi
|
||||
|
||||
[ -z "$kdump_stdloglvl" ] && kdump_stdloglvl=3
|
||||
[ -z "$kdump_sysloglvl" ] && kdump_sysloglvl=0
|
||||
[ -z "$kdump_kmsgloglvl" ] && kdump_kmsgloglvl=0
|
||||
|
||||
for loglvl in "$kdump_stdloglvl" "$kdump_kmsgloglvl" "$kdump_sysloglvl"; do
|
||||
check_loglvl "$loglvl"
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Illegal log level: $kdump_stdloglvl $kdump_kmsgloglvl $kdump_sysloglvl"
|
||||
return 1
|
||||
fi
|
||||
done
|
||||
|
||||
# Skip initialization if it's already done.
|
||||
[ -n "$kdump_maxloglvl" ] && return 0
|
||||
|
||||
if [[ $UID -ne 0 ]]; then
|
||||
kdump_kmsgloglvl=0
|
||||
kdump_sysloglvl=0
|
||||
fi
|
||||
|
||||
if [[ $kdump_sysloglvl -gt 0 ]]; then
|
||||
if [[ -d /run/systemd/journal ]] \
|
||||
&& type -P systemd-cat &>/dev/null \
|
||||
&& systemctl --quiet is-active systemd-journald.socket &>/dev/null; then
|
||||
readonly _systemdcatfile="/var/tmp/systemd-cat"
|
||||
mkfifo "$_systemdcatfile" &>/dev/null
|
||||
readonly _dlogfd=15
|
||||
systemd-cat -t 'kdump' --level-prefix=true <"$_systemdcatfile" &
|
||||
exec 15>"$_systemdcatfile"
|
||||
elif ! [ -S /dev/log -a -w /dev/log ] || ! command -v logger >/dev/null; then
|
||||
# We cannot log to syslog, so turn this facility off.
|
||||
kdump_kmsgloglvl=$kdump_sysloglvl
|
||||
kdump_sysloglvl=0
|
||||
ret=1
|
||||
errmsg="No '/dev/log' or 'logger' included for syslog logging"
|
||||
fi
|
||||
fi
|
||||
|
||||
local lvl; local maxloglvl_l=0
|
||||
for lvl in $kdump_stdloglvl $kdump_sysloglvl $kdump_kmsgloglvl; do
|
||||
[[ $lvl -gt $maxloglvl_l ]] && maxloglvl_l=$lvl
|
||||
done
|
||||
readonly kdump_maxloglvl=$maxloglvl_l
|
||||
export kdump_maxloglvl
|
||||
|
||||
if [[ $kdump_stdloglvl -lt 4 ]] && [[ $kdump_kmsgloglvl -lt 4 ]] && [[ $kdump_sysloglvl -lt 4 ]]; then
|
||||
unset ddebug
|
||||
ddebug() { :; };
|
||||
fi
|
||||
|
||||
if [[ $kdump_stdloglvl -lt 3 ]] && [[ $kdump_kmsgloglvl -lt 3 ]] && [[ $kdump_sysloglvl -lt 3 ]]; then
|
||||
unset dinfo
|
||||
dinfo() { :; };
|
||||
fi
|
||||
|
||||
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 1 ]] && [[ $kdump_kmsgloglvl -lt 1 ]] && [[ $kdump_sysloglvl -lt 1 ]]; then
|
||||
unset derror
|
||||
derror() { :; };
|
||||
fi
|
||||
|
||||
[ -n "$errmsg" ] && derror "$errmsg"
|
||||
|
||||
return $ret
|
||||
}
|
||||
|
||||
## @brief Converts numeric level to logger priority defined by POSIX.2.
|
||||
#
|
||||
# @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 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 4.
|
||||
# @retval 1 if @a lvl is out of range.
|
||||
# @retval 0 if @a lvl is correct.
|
||||
# @result Echoes kernel console numeric log level
|
||||
#
|
||||
# Conversion is done as follows:
|
||||
#
|
||||
# <tt>
|
||||
# none -> LOG_EMERG (0)
|
||||
# none -> LOG_ALERT (1)
|
||||
# none -> LOG_CRIT (2)
|
||||
# ERROR(1) -> LOG_ERR (3)
|
||||
# WARN(2) -> LOG_WARNING (4)
|
||||
# none -> LOG_NOTICE (5)
|
||||
# INFO(3) -> LOG_INFO (6)
|
||||
# DEBUG(4) -> LOG_DEBUG (7)
|
||||
# </tt>
|
||||
#
|
||||
# @see /usr/include/sys/syslog.h
|
||||
_dlvl2syslvl() {
|
||||
local lvl
|
||||
|
||||
case "$1" in
|
||||
1) lvl=3;;
|
||||
2) lvl=4;;
|
||||
3) lvl=6;;
|
||||
4) lvl=7;;
|
||||
*) return 1;;
|
||||
esac
|
||||
|
||||
# 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, 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
|
||||
# dinfo(), ddebug(), or others instead which wrap this one.
|
||||
#
|
||||
# This is core logging function which logs given message to standard error
|
||||
# and/or syslog (with POSIX shell command <tt>logger</tt>) and/or to /dev/kmsg.
|
||||
# The format is following:
|
||||
#
|
||||
# <tt>X: some message</tt>
|
||||
#
|
||||
# where @c X is the first letter of logging level. See module description for
|
||||
# details on that.
|
||||
#
|
||||
# Message to syslog is sent with tag @c kdump. Priorities are mapped as
|
||||
# following:
|
||||
# - @c ERROR to @c error
|
||||
# - @c WARN to @c warning
|
||||
# - @c INFO to @c info
|
||||
# - @c DEBUG to @c debug
|
||||
_do_dlog() {
|
||||
local lvl="$1"; shift
|
||||
local msg="$*"
|
||||
|
||||
[[ $lvl -le $kdump_stdloglvl ]] && printf -- 'kdump: %s\n' "$msg" >&2
|
||||
|
||||
if [[ $lvl -le $kdump_sysloglvl ]]; then
|
||||
if [[ "$_dlogfd" ]]; then
|
||||
printf -- "<%s>%s\n" "$(($(_dlvl2syslvl $lvl) & 7))" "$msg" >&$_dlogfd
|
||||
else
|
||||
logger -t "kdump[$$]" -p $(_lvl2syspri $lvl) -- "$msg"
|
||||
fi
|
||||
fi
|
||||
|
||||
[[ $lvl -le $kdump_kmsgloglvl ]] && \
|
||||
echo "<$(_dlvl2syslvl $lvl)>kdump[$$] $msg" >/dev/kmsg
|
||||
}
|
||||
|
||||
## @brief Internal helper function for _do_dlog()
|
||||
#
|
||||
# @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
|
||||
# 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
|
||||
# a message.
|
||||
#
|
||||
# This enables:
|
||||
# dwarn "This is a warning"
|
||||
# echo "This is a warning" | dwarn
|
||||
dlog() {
|
||||
[ -z "$kdump_maxloglvl" ] && return 0
|
||||
[[ $1 -le $kdump_maxloglvl ]] || return 0
|
||||
|
||||
if [[ $# -gt 1 ]]; then
|
||||
_do_dlog "$@"
|
||||
else
|
||||
while read line || [ -n "$line" ]; do
|
||||
_do_dlog "$1" "$line"
|
||||
done
|
||||
fi
|
||||
}
|
||||
|
||||
## @brief Logs message at DEBUG level (4)
|
||||
#
|
||||
# @param msg Message.
|
||||
# @retval 0 It's always returned, even if logging failed.
|
||||
ddebug() {
|
||||
set +x
|
||||
dlog 4 "$@"
|
||||
[ -n "$debug" ] && set -x || :
|
||||
}
|
||||
|
||||
## @brief Logs message at INFO level (3)
|
||||
#
|
||||
# @param msg Message.
|
||||
# @retval 0 It's always returned, even if logging failed.
|
||||
dinfo() {
|
||||
set +x
|
||||
dlog 3 "$@"
|
||||
[ -n "$debug" ] && set -x || :
|
||||
}
|
||||
|
||||
## @brief Logs message at WARN level (2)
|
||||
#
|
||||
# @param msg Message.
|
||||
# @retval 0 It's always returned, even if logging failed.
|
||||
dwarn() {
|
||||
set +x
|
||||
dlog 2 "$@"
|
||||
[ -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 (1)
|
||||
#
|
||||
# @param msg Message.
|
||||
# @retval 0 It's always returned, even if logging failed.
|
||||
derror() {
|
||||
set +x
|
||||
dlog 1 "$@"
|
||||
[ -n "$debug" ] && set -x || :
|
||||
}
|
@ -21,7 +21,7 @@
|
||||
# <mnt>/<path>/%HOST-%DATE/, supports DNS.
|
||||
#
|
||||
# ssh <user@server>
|
||||
# - Will scp /proc/vmcore to <user@server>:<path>/%HOST-%DATE/,
|
||||
# - Will save /proc/vmcore to <user@server>:<path>/%HOST-%DATE/,
|
||||
# supports DNS.
|
||||
# NOTE: make sure the user has write permissions on the server.
|
||||
#
|
||||
@ -62,9 +62,9 @@
|
||||
# as the initrd will automatically be populated with a
|
||||
# config file appropriate for the running kernel.
|
||||
# The default core_collector for raw/ssh dump is:
|
||||
# "makedumpfile -F -l --message-level 1 -d 31".
|
||||
# "makedumpfile -F -l --message-level 7 -d 31".
|
||||
# The default core_collector for other targets is:
|
||||
# "makedumpfile -l --message-level 1 -d 31".
|
||||
# "makedumpfile -l --message-level 7 -d 31".
|
||||
#
|
||||
# "makedumpfile -F" will create a flattened vmcore.
|
||||
# You need to use "makedumpfile -R" to rearrange the dump data to
|
||||
@ -166,10 +166,12 @@
|
||||
#ext4 LABEL=/boot
|
||||
#ext4 UUID=03138356-5e61-4ab3-b58e-27507ac41937
|
||||
#nfs my.server.com:/export/tmp
|
||||
#nfs [2001:db8::1:2:3:4]:/export/tmp
|
||||
#ssh user@my.server.com
|
||||
#ssh user@2001:db8::1:2:3:4
|
||||
#sshkey /root/.ssh/kdump_id_rsa
|
||||
path /var/crash
|
||||
core_collector makedumpfile -l --message-level 1 -d 31
|
||||
core_collector makedumpfile -l --message-level 7 -d 31
|
||||
#core_collector scp
|
||||
#kdump_post /var/crash/scripts/kdump-post.sh
|
||||
#kdump_pre /var/crash/scripts/kdump-pre.sh
|
||||
|
@ -85,9 +85,9 @@ for the running kernel.
|
||||
.PP
|
||||
Note 1: About default core collector:
|
||||
The default core_collector for raw/ssh dump is:
|
||||
"makedumpfile -F -l --message-level 1 -d 31".
|
||||
"makedumpfile -F -l --message-level 7 -d 31".
|
||||
The default core_collector for other targets is:
|
||||
"makedumpfile -l --message-level 1 -d 31".
|
||||
"makedumpfile -l --message-level 7 -d 31".
|
||||
Even if core_collector option is commented out in kdump.conf, makedumpfile
|
||||
is the default core collector and kdump uses it internally.
|
||||
If one does not want makedumpfile as default core_collector, then they
|
||||
@ -98,6 +98,11 @@ vmcore.flat, you will need to use "makedumpfile -R" to rearrange the
|
||||
dump data from standard input to a normal dumpfile (readable with analysis
|
||||
tools).
|
||||
ie. "makedumpfile -R vmcore < vmcore.flat"
|
||||
.PP
|
||||
Note 3: If specified core_collector simply copy the vmcore file to the
|
||||
dump target (eg: cp, scp), the vmcore could be significantly large.
|
||||
Please make sure the dump target has enough space, at leaset larger
|
||||
than the system's RAM.
|
||||
|
||||
.RE
|
||||
|
||||
@ -307,11 +312,11 @@ Above will effectively be translated to:
|
||||
cp --sparse=always /proc/vmcore <dest-path>/vmcore
|
||||
.TP
|
||||
ex2.
|
||||
core_collector "makedumpfile -l --message-level 1 -d 31"
|
||||
core_collector "makedumpfile -l --message-level 7 -d 31"
|
||||
|
||||
Above will effectively be translated to:
|
||||
|
||||
makedumpfile -l --message-level 1 -d 31 /proc/vmcore <dest-path>/vmcore
|
||||
makedumpfile -l --message-level 7 -d 31 /proc/vmcore <dest-path>/vmcore
|
||||
.PP
|
||||
For dump targets like raw and ssh, in general, core collector should expect
|
||||
one argument (source file) and should output the processed core on standard
|
||||
@ -328,11 +333,11 @@ Above will effectively be translated to.
|
||||
cat /proc/vmcore | dd of=<target-device>
|
||||
.TP
|
||||
ex4.
|
||||
core_collector "makedumpfile -F -l --message-level 1 -d 31"
|
||||
core_collector "makedumpfile -F -l --message-level 7 -d 31"
|
||||
|
||||
Above will effectively be translated to.
|
||||
|
||||
makedumpfile -F -l --message-level 1 -d 31 | dd of=<target-device>
|
||||
makedumpfile -F -l --message-level 7 -d 31 | dd of=<target-device>
|
||||
.PP
|
||||
ssh dumps examples
|
||||
.TP
|
||||
@ -344,11 +349,11 @@ Above will effectively be translated to.
|
||||
cat /proc/vmcore | ssh <options> <remote-location> "dd of=path/vmcore"
|
||||
.TP
|
||||
ex6.
|
||||
core_collector "makedumpfile -F -l --message-level 1 -d 31"
|
||||
core_collector "makedumpfile -F -l --message-level 7 -d 31"
|
||||
|
||||
Above will effectively be translated to.
|
||||
|
||||
makedumpfile -F -l --message-level 1 -d 31 | ssh <options> <remote-location> "dd of=path/vmcore"
|
||||
makedumpfile -F -l --message-level 7 -d 31 | ssh <options> <remote-location> "dd of=path/vmcore"
|
||||
|
||||
There is one exception to standard output rule for ssh dumps. And that is
|
||||
scp. As scp can handle ssh destinations for file transfers, one can
|
||||