Compare commits
No commits in common. "imports/c8-beta/kexec-tools-2.0.19-7.el8" and "c8" have entirely different histories.
imports/c8
...
c8
|
@ -1,3 +1,3 @@
|
||||||
|
SOURCES/1.7.2.tar.gz
|
||||||
SOURCES/eppic_050615.tar.gz
|
SOURCES/eppic_050615.tar.gz
|
||||||
SOURCES/kexec-tools-2.0.19.tar.xz
|
SOURCES/kexec-tools-2.0.26.tar.xz
|
||||||
SOURCES/makedumpfile-1.6.5.tar.gz
|
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
a096c8e0892b559f40b01916aae240652f75b68a SOURCES/eppic_050615.tar.gz
|
|
||||||
5d080337da7a1603e542fc3db1f08cf8685eda02 SOURCES/kexec-tools-2.0.19.tar.xz
|
|
||||||
700f2ff13f75d97a0df2303ff9f580cdddadf7b0 SOURCES/makedumpfile-1.6.5.tar.gz
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
#!/usr/bin/bash
|
||||||
|
|
||||||
|
COMMAND="$1"
|
||||||
|
KERNEL_VERSION="$2"
|
||||||
|
KDUMP_INITRD_DIR_ABS="$3"
|
||||||
|
KERNEL_IMAGE="$4"
|
||||||
|
|
||||||
|
if ! [[ ${KERNEL_INSTALL_MACHINE_ID-x} ]]; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -d "$KDUMP_INITRD_DIR_ABS" ]]; then
|
||||||
|
KDUMP_INITRD="initrdkdump"
|
||||||
|
else
|
||||||
|
# If `KDUMP_BOOTDIR` is not writable, then the kdump
|
||||||
|
# initrd must have been placed at `/var/lib/kdump`
|
||||||
|
if [[ ! -w "/boot" ]]; then
|
||||||
|
KDUMP_INITRD_DIR_ABS="/var/lib/kdump"
|
||||||
|
else
|
||||||
|
KDUMP_INITRD_DIR_ABS="/boot"
|
||||||
|
fi
|
||||||
|
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 -- "$KDUMP_INITRD_DIR_ABS/$KDUMP_INITRD"
|
||||||
|
ret=$?
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
exit $ret
|
|
@ -1,15 +1,22 @@
|
||||||
SUBSYSTEM=="cpu", ACTION=="online", GOTO="kdump_reload"
|
SUBSYSTEM=="cpu", ACTION=="online", GOTO="kdump_reload_cpu"
|
||||||
SUBSYSTEM=="memory", ACTION=="online", GOTO="kdump_reload"
|
SUBSYSTEM=="memory", ACTION=="online", GOTO="kdump_reload_mem"
|
||||||
SUBSYSTEM=="memory", ACTION=="offline", GOTO="kdump_reload"
|
SUBSYSTEM=="memory", ACTION=="offline", GOTO="kdump_reload_mem"
|
||||||
|
|
||||||
GOTO="kdump_reload_end"
|
GOTO="kdump_reload_end"
|
||||||
|
|
||||||
LABEL="kdump_reload"
|
|
||||||
|
|
||||||
# If kdump is not loaded, calling kdump-udev-throttle will end up
|
# If kdump is not loaded, calling kdump-udev-throttle will end up
|
||||||
# doing nothing, but systemd-run will always generate extra logs for
|
# doing nothing, but systemd-run will always generate extra logs for
|
||||||
# each call, so trigger the kdump-udev-throttler only if kdump
|
# each call, so trigger the kdump-udev-throttler only if kdump
|
||||||
# service is active to avoid unnecessary logs
|
# service is active to avoid unnecessary logs
|
||||||
|
|
||||||
|
LABEL="kdump_reload_mem"
|
||||||
|
|
||||||
RUN+="/bin/sh -c '/usr/bin/systemctl is-active kdump.service || exit 0; /usr/bin/systemd-run --quiet --no-block /usr/lib/udev/kdump-udev-throttler'"
|
RUN+="/bin/sh -c '/usr/bin/systemctl is-active kdump.service || exit 0; /usr/bin/systemd-run --quiet --no-block /usr/lib/udev/kdump-udev-throttler'"
|
||||||
|
|
||||||
|
GOTO="kdump_reload_end"
|
||||||
|
|
||||||
|
LABEL="kdump_reload_cpu"
|
||||||
|
|
||||||
|
RUN+="/bin/sh -c '/usr/bin/systemctl is-active kdump.service || exit 0; ! test -f /sys/kernel/fadump_enabled || cat /sys/kernel/fadump_enabled | grep 0 || exit 0; /usr/bin/systemd-run --quiet --no-block /usr/lib/udev/kdump-udev-throttler'"
|
||||||
|
|
||||||
LABEL="kdump_reload_end"
|
LABEL="kdump_reload_end"
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
. /etc/sysconfig/kdump
|
. /etc/sysconfig/kdump
|
||||||
. /lib/kdump/kdump-lib.sh
|
|
||||||
|
|
||||||
KDUMP_KERNEL=""
|
KDUMP_KERNEL=""
|
||||||
KDUMP_INITRD=""
|
KDUMP_INITRD=""
|
||||||
|
@ -21,18 +20,15 @@ depends() {
|
||||||
}
|
}
|
||||||
|
|
||||||
prepare_kernel_initrd() {
|
prepare_kernel_initrd() {
|
||||||
KDUMP_BOOTDIR=$(check_boot_dir "${KDUMP_BOOTDIR}")
|
. /lib/kdump/kdump-lib.sh
|
||||||
if [ -z "$KDUMP_KERNELVER" ]; then
|
|
||||||
kdump_kver=`uname -r`
|
prepare_kdump_bootinfo
|
||||||
if [ "$kernel" != "$kdump_kver" ]; then
|
|
||||||
dwarn "Using current kernel version '$kdump_kver' for early kdump," \
|
# $kernel is a variable from dracut
|
||||||
"but the initramfs is generated for kernel version '$kernel'"
|
if [ "$KDUMP_KERNELVER" != $kernel ]; then
|
||||||
fi
|
dwarn "Using kernel version '$KDUMP_KERNELVER' for early kdump," \
|
||||||
else
|
"but the initramfs is generated for kernel version '$kernel'"
|
||||||
kdump_kver=$KDUMP_KERNELVER
|
|
||||||
fi
|
fi
|
||||||
KDUMP_KERNEL="${KDUMP_BOOTDIR}/${KDUMP_IMG}-${kdump_kver}${KDUMP_IMG_EXT}"
|
|
||||||
KDUMP_INITRD="${KDUMP_BOOTDIR}/initramfs-${kdump_kver}kdump.img"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
install() {
|
install() {
|
||||||
|
@ -53,13 +49,16 @@ install() {
|
||||||
inst_simple "/etc/sysconfig/kdump"
|
inst_simple "/etc/sysconfig/kdump"
|
||||||
inst_binary "/usr/sbin/kexec"
|
inst_binary "/usr/sbin/kexec"
|
||||||
inst_binary "/usr/bin/gawk" "/usr/bin/awk"
|
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-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_hook cmdline 00 "$moddir/early-kdump.sh"
|
||||||
inst_binary "$KDUMP_KERNEL"
|
inst_binary "$KDUMP_KERNEL"
|
||||||
inst_binary "$KDUMP_INITRD"
|
inst_binary "$KDUMP_INITRD"
|
||||||
|
|
||||||
ln_r "$KDUMP_KERNEL" "${KDUMP_BOOTDIR}/${KDUMP_IMG}-earlykdump${KDUMP_IMG_EXT}"
|
ln_r "$KDUMP_KERNEL" "/boot/kernel-earlykdump"
|
||||||
ln_r "$KDUMP_INITRD" "${KDUMP_BOOTDIR}/initramfs-earlykdump.img"
|
ln_r "$KDUMP_INITRD" "/boot/initramfs-earlykdump"
|
||||||
|
|
||||||
chmod -x "${initdir}/$KDUMP_KERNEL"
|
chmod -x "${initdir}/$KDUMP_KERNEL"
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,14 +12,20 @@ EARLY_KEXEC_ARGS=""
|
||||||
. /etc/sysconfig/kdump
|
. /etc/sysconfig/kdump
|
||||||
. /lib/dracut-lib.sh
|
. /lib/dracut-lib.sh
|
||||||
. /lib/kdump-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()
|
prepare_parameters()
|
||||||
{
|
{
|
||||||
EARLY_KDUMP_CMDLINE=$(prepare_cmdline "${KDUMP_COMMANDLINE}" "${KDUMP_COMMANDLINE_REMOVE}" "${KDUMP_COMMANDLINE_APPEND}")
|
EARLY_KDUMP_CMDLINE=$(prepare_cmdline "${KDUMP_COMMANDLINE}" "${KDUMP_COMMANDLINE_REMOVE}" "${KDUMP_COMMANDLINE_APPEND}")
|
||||||
KDUMP_BOOTDIR=$(check_boot_dir "${KDUMP_BOOTDIR}")
|
EARLY_KDUMP_KERNEL="/boot/kernel-earlykdump"
|
||||||
|
EARLY_KDUMP_INITRD="/boot/initramfs-earlykdump"
|
||||||
EARLY_KDUMP_KERNEL="${KDUMP_BOOTDIR}/${KDUMP_IMG}-earlykdump${KDUMP_IMG_EXT}"
|
|
||||||
EARLY_KDUMP_INITRD="${KDUMP_BOOTDIR}/initramfs-earlykdump.img"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
early_kdump_load()
|
early_kdump_load()
|
||||||
|
@ -30,7 +36,7 @@ early_kdump_load()
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if is_fadump_capable; then
|
if is_fadump_capable; then
|
||||||
echo "WARNING: early kdump doesn't support fadump."
|
dwarn "WARNING: early kdump doesn't support fadump."
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -43,19 +49,21 @@ early_kdump_load()
|
||||||
|
|
||||||
EARLY_KEXEC_ARGS=$(prepare_kexec_args "${KEXEC_ARGS}")
|
EARLY_KEXEC_ARGS=$(prepare_kexec_args "${KEXEC_ARGS}")
|
||||||
|
|
||||||
if is_secure_boot_enforced; then
|
# Here, only output the messages, but do not save these messages
|
||||||
echo "Secure Boot is enabled. Using kexec file based syscall."
|
# to a file because the target disk may not be mounted yet, the
|
||||||
EARLY_KEXEC_ARGS="$EARLY_KEXEC_ARGS -s"
|
# earlykdump is too early.
|
||||||
fi
|
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 \
|
$KEXEC ${EARLY_KEXEC_ARGS} $standard_kexec_args \
|
||||||
--command-line="$EARLY_KDUMP_CMDLINE" \
|
--command-line="$EARLY_KDUMP_CMDLINE" \
|
||||||
--initrd=$EARLY_KDUMP_INITRD $EARLY_KDUMP_KERNEL
|
--initrd=$EARLY_KDUMP_INITRD $EARLY_KDUMP_KERNEL
|
||||||
if [ $? == 0 ]; then
|
if [ $? == 0 ]; then
|
||||||
echo "kexec: loaded early-kdump kernel"
|
dinfo "kexec: loaded early-kdump kernel"
|
||||||
return 0
|
return 0
|
||||||
else
|
else
|
||||||
echo "kexec: failed to load early-kdump kernel"
|
derror "kexec: failed to load early-kdump kernel"
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
@ -63,10 +71,10 @@ early_kdump_load()
|
||||||
set_early_kdump()
|
set_early_kdump()
|
||||||
{
|
{
|
||||||
if getargbool 0 rd.earlykdump; then
|
if getargbool 0 rd.earlykdump; then
|
||||||
echo "early-kdump is enabled."
|
dinfo "early-kdump is enabled."
|
||||||
early_kdump_load
|
early_kdump_load
|
||||||
else
|
else
|
||||||
echo "early-kdump is disabled."
|
dinfo "early-kdump is disabled."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
#!/bin/sh
|
||||||
|
export PATH=/usr/bin:/usr/sbin
|
||||||
|
export SYSTEMD_IN_INITRD=lenient
|
||||||
|
|
||||||
|
[ -e /proc/mounts ] ||
|
||||||
|
(mkdir -p /proc && mount -t proc -o nosuid,noexec,nodev proc /proc)
|
||||||
|
|
||||||
|
grep -q '^sysfs /sys sysfs' /proc/mounts ||
|
||||||
|
(mkdir -p /sys && mount -t sysfs -o nosuid,noexec,nodev sysfs /sys)
|
||||||
|
|
||||||
|
grep -q '^none / ' /proc/mounts || grep -q '^rootfs / ' /proc/mounts && ROOTFS_IS_RAMFS=1
|
||||||
|
|
||||||
|
if [ -f /proc/device-tree/rtas/ibm,kernel-dump ] || [ -f /proc/device-tree/ibm,opal/dump/mpipl-boot ]; then
|
||||||
|
mkdir /newroot
|
||||||
|
mount -t ramfs ramfs /newroot
|
||||||
|
|
||||||
|
if [ $ROOTFS_IS_RAMFS ]; then
|
||||||
|
for FILE in $(ls -A /fadumproot/); do
|
||||||
|
mv /fadumproot/$FILE /newroot/
|
||||||
|
done
|
||||||
|
exec switch_root /newroot /init
|
||||||
|
else
|
||||||
|
mkdir /newroot/sys /newroot/proc /newroot/dev /newroot/run /newroot/oldroot
|
||||||
|
|
||||||
|
grep -q '^devtmpfs /dev devtmpfs' /proc/mounts && mount --move /dev /newroot/dev
|
||||||
|
grep -q '^tmpfs /run tmpfs' /proc/mounts && mount --move /run /newroot/run
|
||||||
|
mount --move /sys /newroot/sys
|
||||||
|
mount --move /proc /newroot/proc
|
||||||
|
|
||||||
|
cp --reflink=auto --sparse=auto --preserve=mode,timestamps,links -dfr /fadumproot/. /newroot/
|
||||||
|
cd /newroot && pivot_root . oldroot
|
||||||
|
|
||||||
|
loop=1
|
||||||
|
while [ $loop ]; do
|
||||||
|
unset loop
|
||||||
|
while read -r _ mp _; do
|
||||||
|
case $mp in
|
||||||
|
/oldroot/*) umount -d "$mp" && loop=1 ;;
|
||||||
|
esac
|
||||||
|
done </proc/mounts
|
||||||
|
done
|
||||||
|
umount -d -l oldroot
|
||||||
|
|
||||||
|
exec /init
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exec /init.dracut
|
||||||
|
fi
|
|
@ -0,0 +1,23 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
check() {
|
||||||
|
return 255
|
||||||
|
}
|
||||||
|
|
||||||
|
depends() {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
install() {
|
||||||
|
mv -f "$initdir/init" "$initdir/init.dracut"
|
||||||
|
inst_script "$moddir/init-fadump.sh" /init
|
||||||
|
chmod a+x "$initdir/init"
|
||||||
|
|
||||||
|
# Install required binaries for the init script (init-fadump.sh)
|
||||||
|
inst_multiple sh modprobe grep mkdir mount
|
||||||
|
if dracut_module_included "squash"; then
|
||||||
|
inst_multiple cp pivot_root umount
|
||||||
|
else
|
||||||
|
inst_multiple ls mv switch_root
|
||||||
|
fi
|
||||||
|
}
|
|
@ -21,7 +21,6 @@ Environment=DRACUT_SYSTEMD=1
|
||||||
Environment=NEWROOT=/sysroot
|
Environment=NEWROOT=/sysroot
|
||||||
WorkingDirectory=/
|
WorkingDirectory=/
|
||||||
ExecStart=/bin/kdump-error-handler.sh
|
ExecStart=/bin/kdump-error-handler.sh
|
||||||
ExecStopPost=-/usr/bin/systemctl --fail --no-block default
|
|
||||||
Type=oneshot
|
Type=oneshot
|
||||||
StandardInput=tty-force
|
StandardInput=tty-force
|
||||||
StandardOutput=inherit
|
StandardOutput=inherit
|
||||||
|
|
|
@ -1,11 +1,10 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
# continue here only if we have to save dump.
|
# continue here only if we have to save dump.
|
||||||
if [ -f /etc/fadump.initramfs ] && [ ! -f /proc/device-tree/rtas/ibm,kernel-dump ]; then
|
if [ -f /etc/fadump.initramfs ] && [ ! -f /proc/device-tree/rtas/ibm,kernel-dump ] && [ ! -f /proc/device-tree/ibm,opal/dump/mpipl-boot ]; then
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
exec &> /dev/console
|
|
||||||
. /lib/dracut-lib.sh
|
. /lib/dracut-lib.sh
|
||||||
. /lib/kdump-lib-initramfs.sh
|
. /lib/kdump-lib-initramfs.sh
|
||||||
|
|
||||||
|
@ -22,7 +21,7 @@ do_dump()
|
||||||
_ret=$?
|
_ret=$?
|
||||||
|
|
||||||
if [ $_ret -ne 0 ]; then
|
if [ $_ret -ne 0 ]; then
|
||||||
echo "kdump: saving vmcore failed"
|
derror "saving vmcore failed"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
return $_ret
|
return $_ret
|
||||||
|
@ -30,15 +29,50 @@ do_dump()
|
||||||
|
|
||||||
do_kdump_pre()
|
do_kdump_pre()
|
||||||
{
|
{
|
||||||
|
local _ret
|
||||||
|
|
||||||
if [ -n "$KDUMP_PRE" ]; then
|
if [ -n "$KDUMP_PRE" ]; then
|
||||||
"$KDUMP_PRE"
|
"$KDUMP_PRE"
|
||||||
|
_ret=$?
|
||||||
|
if [ $_ret -ne 0 ]; then
|
||||||
|
derror "$KDUMP_PRE exited with $_ret status"
|
||||||
|
return $_ret
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# if any script fails, it just raises warning and continues
|
||||||
|
if [ -d /etc/kdump/pre.d ]; then
|
||||||
|
for file in /etc/kdump/pre.d/*; do
|
||||||
|
"$file"
|
||||||
|
_ret=$?
|
||||||
|
if [ $_ret -ne 0 ]; then
|
||||||
|
derror "$file exited with $_ret status"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
do_kdump_post()
|
do_kdump_post()
|
||||||
{
|
{
|
||||||
|
local _ret
|
||||||
|
|
||||||
|
if [ -d /etc/kdump/post.d ]; then
|
||||||
|
for file in /etc/kdump/post.d/*; do
|
||||||
|
"$file" "$1"
|
||||||
|
_ret=$?
|
||||||
|
if [ $_ret -ne 0 ]; then
|
||||||
|
derror "$file exited with $_ret status"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
if [ -n "$KDUMP_POST" ]; then
|
if [ -n "$KDUMP_POST" ]; then
|
||||||
"$KDUMP_POST" "$1"
|
"$KDUMP_POST" "$1"
|
||||||
|
_ret=$?
|
||||||
|
if [ $_ret -ne 0 ]; then
|
||||||
|
derror "$KDUMP_POST exited with $_ret status"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,7 +87,7 @@ dump_raw()
|
||||||
|
|
||||||
[ -b "$_raw" ] || return 1
|
[ -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
|
if ! $(echo -n $CORE_COLLECTOR|grep -q makedumpfile); then
|
||||||
_src_size=`ls -l /proc/vmcore | cut -d' ' -f5`
|
_src_size=`ls -l /proc/vmcore | cut -d' ' -f5`
|
||||||
|
@ -61,38 +95,119 @@ dump_raw()
|
||||||
monitor_dd_progress $_src_size_mb &
|
monitor_dd_progress $_src_size_mb &
|
||||||
fi
|
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
|
$CORE_COLLECTOR /proc/vmcore | dd of=$_raw bs=$DD_BLKSIZE >> /tmp/dd_progress_file 2>&1 || return 1
|
||||||
sync
|
sync
|
||||||
|
|
||||||
echo "kdump: saving vmcore complete"
|
dinfo "saving vmcore complete"
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
dump_ssh()
|
dump_ssh()
|
||||||
{
|
{
|
||||||
|
local _ret=0
|
||||||
|
local _exitcode=0 _exitcode2=0
|
||||||
local _opt="-i $1 -o BatchMode=yes -o StrictHostKeyChecking=yes"
|
local _opt="-i $1 -o BatchMode=yes -o StrictHostKeyChecking=yes"
|
||||||
local _dir="$KDUMP_PATH/$HOST_IP-$DATEDIR"
|
local _dir="$KDUMP_PATH/$HOST_IP-$DATEDIR"
|
||||||
local _host=$2
|
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
|
cat /var/lib/random-seed > /dev/urandom
|
||||||
ssh -q $_opt $_host mkdir -p $_dir || return 1
|
ssh -q $_opt $_host mkdir -p $_dir || return 1
|
||||||
|
|
||||||
save_vmcore_dmesg_ssh ${DMESG_COLLECTOR} ${_dir} "${_opt}" $_host
|
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
|
if is_ipv6_address "$_host"; then
|
||||||
scp -q $_opt /proc/vmcore "$_host:$_dir/vmcore-incomplete" || return 1
|
_username=${_host%@*}
|
||||||
ssh $_opt $_host "mv $_dir/vmcore-incomplete $_dir/vmcore" || return 1
|
_ipv6_addr="[${_host#*@}]"
|
||||||
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
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "kdump: saving vmcore complete"
|
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 "umask 0077 && 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
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
if [ -f /sys/firmware/opal/core ]; then
|
||||||
|
OPALCORE="/sys/firmware/opal/core"
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
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
|
||||||
|
derror "saving opalcore failed"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
ssh $_opts $_location mv $_path/opalcore-incomplete $_path/opalcore
|
||||||
|
dinfo "saving opalcore complete"
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -102,15 +217,15 @@ save_vmcore_dmesg_ssh() {
|
||||||
local _opts="$3"
|
local _opts="$3"
|
||||||
local _location=$4
|
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"
|
$_dmesg_collector /proc/vmcore | ssh $_opts $_location "umask 0077 && dd of=$_path/vmcore-dmesg-incomplete.txt"
|
||||||
_exitcode=$?
|
_exitcode=$?
|
||||||
|
|
||||||
if [ $_exitcode -eq 0 ]; then
|
if [ $_exitcode -eq 0 ]; then
|
||||||
ssh -q $_opts $_location mv $_path/vmcore-dmesg-incomplete.txt $_path/vmcore-dmesg.txt
|
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
|
else
|
||||||
echo "kdump: saving vmcore-dmesg.txt failed"
|
derror "saving vmcore-dmesg.txt failed"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -120,12 +235,12 @@ get_host_ip()
|
||||||
if is_nfs_dump_target || is_ssh_dump_target
|
if is_nfs_dump_target || is_ssh_dump_target
|
||||||
then
|
then
|
||||||
kdumpnic=$(getarg kdumpnic=)
|
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'`
|
_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=`echo $_host | head -n 1 | cut -d' ' -f2`
|
||||||
_host="${_host%%/*}"
|
_host="${_host%%/*}"
|
||||||
[ -z "$_host" ] && echo "kdump: wrong kdumpnic: $kdumpnic" && return 1
|
[ -z "$_host" ] && derror "wrong kdumpnic: $kdumpnic" && return 1
|
||||||
HOST_IP=$_host
|
HOST_IP=$_host
|
||||||
fi
|
fi
|
||||||
return 0
|
return 0
|
||||||
|
@ -134,7 +249,7 @@ get_host_ip()
|
||||||
read_kdump_conf()
|
read_kdump_conf()
|
||||||
{
|
{
|
||||||
if [ ! -f "$KDUMP_CONF" ]; then
|
if [ ! -f "$KDUMP_CONF" ]; then
|
||||||
echo "kdump: $KDUMP_CONF not found"
|
derror "$KDUMP_CONF not found"
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -147,9 +262,13 @@ read_kdump_conf()
|
||||||
case "$config_opt" in
|
case "$config_opt" in
|
||||||
dracut_args)
|
dracut_args)
|
||||||
config_val=$(get_dracut_args_target "$config_val")
|
config_val=$(get_dracut_args_target "$config_val")
|
||||||
[ -n "$config_val" ] && add_dump_code "dump_fs $config_val"
|
if [ -n "$config_val" ]; then
|
||||||
|
config_val=$(get_mntpoint_from_target "$config_val")
|
||||||
|
add_dump_code "dump_fs $config_val"
|
||||||
|
fi
|
||||||
;;
|
;;
|
||||||
ext[234]|xfs|btrfs|minix|nfs)
|
ext[234]|xfs|btrfs|minix|nfs)
|
||||||
|
config_val=$(get_mntpoint_from_target "$config_val")
|
||||||
add_dump_code "dump_fs $config_val"
|
add_dump_code "dump_fs $config_val"
|
||||||
;;
|
;;
|
||||||
raw)
|
raw)
|
||||||
|
@ -174,7 +293,7 @@ fence_kdump_notify
|
||||||
|
|
||||||
get_host_ip
|
get_host_ip
|
||||||
if [ $? -ne 0 ]; then
|
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
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -184,8 +303,10 @@ fi
|
||||||
|
|
||||||
do_kdump_pre
|
do_kdump_pre
|
||||||
if [ $? -ne 0 ]; then
|
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
|
do_final_action
|
||||||
|
# During systemd service to reboot the machine, stop this shell script running
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
make_trace_mem "kdump saving vmcore" '1:shortmem' '2+:mem' '3+:slab'
|
make_trace_mem "kdump saving vmcore" '1:shortmem' '2+:mem' '3+:slab'
|
||||||
do_dump
|
do_dump
|
||||||
|
@ -193,7 +314,7 @@ DUMP_RETVAL=$?
|
||||||
|
|
||||||
do_kdump_post $DUMP_RETVAL
|
do_kdump_post $DUMP_RETVAL
|
||||||
if [ $? -ne 0 ]; then
|
if [ $? -ne 0 ]; then
|
||||||
echo "kdump: kdump_post script exited with non-zero status!"
|
derror "kdump_post script exited with non-zero status!"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ $DUMP_RETVAL -ne 0 ]; then
|
if [ $DUMP_RETVAL -ne 0 ]; then
|
||||||
|
|
|
@ -1,11 +1,27 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
. $dracutfunctions
|
_save_kdump_netifs() {
|
||||||
. /lib/kdump/kdump-lib.sh
|
local _name
|
||||||
|
|
||||||
if ! [[ -d "${initdir}/tmp" ]]; then
|
if [[ -n $2 ]]; then
|
||||||
mkdir -p "${initdir}/tmp"
|
_name=$2
|
||||||
fi
|
else
|
||||||
|
_name=$1
|
||||||
|
fi
|
||||||
|
unique_netifs[$1]=$_name
|
||||||
|
}
|
||||||
|
|
||||||
|
_get_kdump_netifs() {
|
||||||
|
echo -n "${!unique_netifs[@]}"
|
||||||
|
}
|
||||||
|
|
||||||
|
kdump_module_init() {
|
||||||
|
if ! [[ -d "${initdir}/tmp" ]]; then
|
||||||
|
mkdir -p "${initdir}/tmp"
|
||||||
|
fi
|
||||||
|
|
||||||
|
. /lib/kdump/kdump-lib.sh
|
||||||
|
}
|
||||||
|
|
||||||
check() {
|
check() {
|
||||||
[[ $debug ]] && set -x
|
[[ $debug ]] && set -x
|
||||||
|
@ -20,46 +36,48 @@ check() {
|
||||||
depends() {
|
depends() {
|
||||||
local _dep="base shutdown"
|
local _dep="base shutdown"
|
||||||
|
|
||||||
is_squash_available() {
|
kdump_module_init
|
||||||
for kmodule in squashfs overlay loop; do
|
|
||||||
if [ -z "$KDUMP_KERNELVER" ]; then
|
add_opt_module() {
|
||||||
modprobe --dry-run $kmodule &>/dev/null || return 1
|
[[ " $omit_dracutmodules " != *\ $1\ * ]] && _dep="$_dep $1"
|
||||||
else
|
|
||||||
modprobe -S $KDUMP_KERNELVER --dry-run $kmodule &>/dev/null || return 1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if is_squash_available; then
|
if is_squash_available; then
|
||||||
_dep="$_dep squash"
|
add_opt_module squash
|
||||||
else
|
else
|
||||||
dwarning "Required modules to build a squashed kdump image is missing!"
|
dwarning "Required modules to build a squashed kdump image is missing!"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -n "$( find /sys/devices -name drm )" ] || [ -d /sys/module/hyperv_fb ]; then
|
add_opt_module watchdog-modules
|
||||||
_dep="$_dep drm"
|
if is_wdt_active; then
|
||||||
|
add_opt_module watchdog
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if is_generic_fence_kdump -o is_pcs_fence_kdump; then
|
if is_ssh_dump_target; then
|
||||||
|
_dep="$_dep ssh-client"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if is_lvm2_thinp_dump_target; then
|
||||||
|
if grep -q lvmthinpool-monitor <<< $(dracut --list-modules); then
|
||||||
|
add_opt_module lvmthinpool-monitor
|
||||||
|
else
|
||||||
|
dwarning "Required lvmthinpool-monitor modules is missing! Please upgrade dracut >= 057."
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$(uname -m)" = "s390x" ]; then
|
||||||
|
_dep="$_dep znet"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$( find /sys/devices -name drm )" ] || [ -d /sys/module/hyperv_fb ]; then
|
||||||
|
add_opt_module drm
|
||||||
|
fi
|
||||||
|
|
||||||
|
if is_generic_fence_kdump || is_pcs_fence_kdump; then
|
||||||
_dep="$_dep network"
|
_dep="$_dep network"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo $_dep
|
echo $_dep
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
kdump_get_persistent_dev() {
|
|
||||||
local dev="${1//\"/}"
|
|
||||||
|
|
||||||
case "$dev" in
|
|
||||||
UUID=*)
|
|
||||||
dev=`blkid -U "${dev#UUID=}"`
|
|
||||||
;;
|
|
||||||
LABEL=*)
|
|
||||||
dev=`blkid -L "${dev#LABEL=}"`
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
echo $(get_persistent_dev "$dev")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
kdump_is_bridge() {
|
kdump_is_bridge() {
|
||||||
|
@ -90,6 +108,17 @@ source_ifcfg_file() {
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
add_dns_netdev() {
|
||||||
|
local _server _route
|
||||||
|
|
||||||
|
_server=$1
|
||||||
|
_route=`/sbin/ip -o route get to $_server 2>&1`
|
||||||
|
[ $? != 0 ] && echo "DNS server $_server unreachable"
|
||||||
|
|
||||||
|
_netdev=$(get_ip_route_field "$_route" "dev")
|
||||||
|
_save_kdump_netifs "$_netdev" "$(kdump_setup_ifname $_netdev)"
|
||||||
|
}
|
||||||
|
|
||||||
# $1: netdev name
|
# $1: netdev name
|
||||||
kdump_setup_dns() {
|
kdump_setup_dns() {
|
||||||
local _nameserver _dns
|
local _nameserver _dns
|
||||||
|
@ -97,8 +126,8 @@ kdump_setup_dns() {
|
||||||
|
|
||||||
source_ifcfg_file $1
|
source_ifcfg_file $1
|
||||||
|
|
||||||
[ -n "$DNS1" ] && echo "nameserver=$DNS1" > "$_dnsfile"
|
[ -n "$DNS1" ] && echo "nameserver=$DNS1" > "$_dnsfile" && add_dns_netdev "$DNS1"
|
||||||
[ -n "$DNS2" ] && echo "nameserver=$DNS2" >> "$_dnsfile"
|
[ -n "$DNS2" ] && echo "nameserver=$DNS2" >> "$_dnsfile" && add_dns_netdev "$DNS2"
|
||||||
|
|
||||||
while read content;
|
while read content;
|
||||||
do
|
do
|
||||||
|
@ -110,16 +139,127 @@ kdump_setup_dns() {
|
||||||
|
|
||||||
if [ ! -f $_dnsfile ] || [ ! $(cat $_dnsfile | grep -q $_dns) ]; then
|
if [ ! -f $_dnsfile ] || [ ! $(cat $_dnsfile | grep -q $_dns) ]; then
|
||||||
echo "nameserver=$_dns" >> "$_dnsfile"
|
echo "nameserver=$_dns" >> "$_dnsfile"
|
||||||
|
add_dns_netdev "$_dns"
|
||||||
fi
|
fi
|
||||||
done < "/etc/resolv.conf"
|
done < "/etc/resolv.conf"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# $1: repeat times
|
||||||
|
# $2: string to be repeated
|
||||||
|
# $3: separator
|
||||||
|
repeatedly_join_str() {
|
||||||
|
local _count="$1"
|
||||||
|
local _str="$2"
|
||||||
|
local _separator="$3"
|
||||||
|
local i _res
|
||||||
|
|
||||||
|
if [[ "$_count" -le 0 ]]; then
|
||||||
|
echo -n ""
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
i=0
|
||||||
|
_res="$_str"
|
||||||
|
((_count--))
|
||||||
|
|
||||||
|
while [[ "$i" -lt "$_count" ]]; do
|
||||||
|
((i++))
|
||||||
|
_res="${_res}${_separator}${_str}"
|
||||||
|
done
|
||||||
|
echo -n "$_res"
|
||||||
|
}
|
||||||
|
|
||||||
|
# $1: prefix
|
||||||
|
# $2: ipv6_flag="-6" indicates it's IPv6
|
||||||
|
# Given a prefix, calculate the netmask (equivalent of "ipcalc -m")
|
||||||
|
# by concatenating three parts,
|
||||||
|
# 1) the groups with all bits set 1
|
||||||
|
# 2) a group with partial bits set to 0
|
||||||
|
# 3) the groups with all bits set to 0
|
||||||
|
cal_netmask_by_prefix() {
|
||||||
|
local _prefix="$1"
|
||||||
|
local _ipv6_flag="$2" _ipv6
|
||||||
|
local _bits_per_octet=8
|
||||||
|
local _count _res _octets_per_group _octets_total _seperator _total_groups
|
||||||
|
local _max_group_value _max_group_value_repr _bits_per_group _tmp _zero_bits
|
||||||
|
|
||||||
|
if [[ "$_ipv6_flag" == "-6" ]]; then
|
||||||
|
_ipv6=1
|
||||||
|
else
|
||||||
|
_ipv6=0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$_prefix" -lt 0 || "$_prefix" -gt 128 ]] || \
|
||||||
|
( ((!_ipv6)) && [[ "$_prefix" -gt 32 ]] ); then
|
||||||
|
derror "Bad prefix:$_prefix for calculating netmask"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ((_ipv6)); then
|
||||||
|
_octets_per_group=2
|
||||||
|
_octets_total=16
|
||||||
|
_seperator=":"
|
||||||
|
else
|
||||||
|
_octets_per_group=1
|
||||||
|
_octets_total=4
|
||||||
|
_seperator="."
|
||||||
|
fi
|
||||||
|
|
||||||
|
_total_groups=$((_octets_total/_octets_per_group))
|
||||||
|
_bits_per_group=$((_octets_per_group * _bits_per_octet))
|
||||||
|
_max_group_value=$(((1 << _bits_per_group) - 1))
|
||||||
|
|
||||||
|
if ((_ipv6)); then
|
||||||
|
_max_group_value_repr=$(printf "%x" $_max_group_value)
|
||||||
|
else
|
||||||
|
_max_group_value_repr="$_max_group_value"
|
||||||
|
fi
|
||||||
|
|
||||||
|
_count=$((_prefix/_octets_per_group/_bits_per_octet))
|
||||||
|
_first_part=$(repeatedly_join_str "$_count" "$_max_group_value_repr" "$_seperator")
|
||||||
|
_res="$_first_part"
|
||||||
|
|
||||||
|
_tmp=$((_octets_total*_bits_per_octet-_prefix))
|
||||||
|
_zero_bits=$(expr $_tmp % $_bits_per_group)
|
||||||
|
if [[ "$_zero_bits" -ne 0 ]]; then
|
||||||
|
_second_part=$((_max_group_value >> _zero_bits << _zero_bits))
|
||||||
|
if ((_ipv6)); then
|
||||||
|
_second_part=$(printf "%x" $_second_part)
|
||||||
|
fi
|
||||||
|
((_count++))
|
||||||
|
if [[ -z "$_first_part" ]]; then
|
||||||
|
_res="$_second_part"
|
||||||
|
else
|
||||||
|
_res="${_first_part}${_seperator}${_second_part}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
_count=$((_total_groups-_count))
|
||||||
|
if [[ "$_count" -eq 0 ]]; then
|
||||||
|
echo -n "$_res"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ((_ipv6)) && [[ "$_count" -gt 1 ]] ; then
|
||||||
|
# use condensed notion for IPv6
|
||||||
|
_third_part=":"
|
||||||
|
else
|
||||||
|
_third_part=$(repeatedly_join_str "$_count" "0" "$_seperator")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -z "$_res" ]] && ((!_ipv6)) ; then
|
||||||
|
echo -n "${_third_part}"
|
||||||
|
else
|
||||||
|
echo -n "${_res}${_seperator}${_third_part}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
#$1: netdev name
|
#$1: netdev name
|
||||||
#$2: srcaddr
|
#$2: srcaddr
|
||||||
#if it use static ip echo it, or echo null
|
#if it use static ip echo it, or echo null
|
||||||
kdump_static_ip() {
|
kdump_static_ip() {
|
||||||
local _netdev="$1" _srcaddr="$2" _ipv6_flag
|
local _netdev="$1" _srcaddr="$2" kdumpnic="$3" _ipv6_flag
|
||||||
local _netmask _gateway _ipaddr _target _nexthop
|
local _netmask _gateway _ipaddr _target _nexthop _prefix
|
||||||
|
|
||||||
_ipaddr=$(ip addr show dev $_netdev permanent | awk "/ $_srcaddr\/.* /{print \$2}")
|
_ipaddr=$(ip addr show dev $_netdev permanent | awk "/ $_srcaddr\/.* /{print \$2}")
|
||||||
|
|
||||||
|
@ -137,7 +277,12 @@ kdump_static_ip() {
|
||||||
_srcaddr="[$_srcaddr]"
|
_srcaddr="[$_srcaddr]"
|
||||||
_gateway="[$_gateway]"
|
_gateway="[$_gateway]"
|
||||||
else
|
else
|
||||||
_netmask=$(ipcalc -m $_ipaddr | cut -d'=' -f2)
|
_prefix=$(cut -d'/' -f2 <<< "$_ipaddr")
|
||||||
|
_netmask=$(cal_netmask_by_prefix "$_prefix" "$_ipv6_flag")
|
||||||
|
if [[ "$?" -ne 0 ]]; then
|
||||||
|
derror "Failed to calculate netmask for $_ipaddr"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
echo -n "${_srcaddr}::${_gateway}:${_netmask}::"
|
echo -n "${_srcaddr}::${_gateway}:${_netmask}::"
|
||||||
fi
|
fi
|
||||||
|
@ -150,7 +295,7 @@ kdump_static_ip() {
|
||||||
_target="[$_target]"
|
_target="[$_target]"
|
||||||
_nexthop="[$_nexthop]"
|
_nexthop="[$_nexthop]"
|
||||||
fi
|
fi
|
||||||
echo "rd.route=$_target:$_nexthop:$_netdev"
|
echo "rd.route=$_target:$_nexthop:$kdumpnic"
|
||||||
done >> ${initdir}/etc/cmdline.d/45route-static.conf
|
done >> ${initdir}/etc/cmdline.d/45route-static.conf
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -190,11 +335,80 @@ kdump_setup_ifname() {
|
||||||
echo "$_ifname"
|
echo "$_ifname"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
kdump_install_nm_netif_allowlist() {
|
||||||
|
local _netif _except_netif _netif_allowlist _netif_allowlist_nm_conf
|
||||||
|
|
||||||
|
for _netif in $1; do
|
||||||
|
_per_mac=$(kdump_get_perm_addr "$_netif")
|
||||||
|
if [[ "$_per_mac" != 'not set' ]]; then
|
||||||
|
_except_netif="mac:$_per_mac"
|
||||||
|
else
|
||||||
|
_except_netif="interface-name:${unique_netifs[${_netif}]}"
|
||||||
|
fi
|
||||||
|
_netif_allowlist="${_netif_allowlist}except:${_except_netif};"
|
||||||
|
done
|
||||||
|
|
||||||
|
_netif_allowlist_nm_conf=${initdir}/tmp/netif_allowlist_nm_conf
|
||||||
|
cat << EOF > "$_netif_allowlist_nm_conf"
|
||||||
|
[device-others]
|
||||||
|
match-device=${_netif_allowlist}
|
||||||
|
managed=false
|
||||||
|
EOF
|
||||||
|
|
||||||
|
inst "$_netif_allowlist_nm_conf" "/etc/NetworkManager/conf.d/10-kdump-netif_allowlist.conf"
|
||||||
|
rm -f "$_netif_allowlist_nm_conf"
|
||||||
|
}
|
||||||
|
|
||||||
|
_get_nic_driver() {
|
||||||
|
ethtool -i "$1" | sed -n -E "s/driver: (.*)/\1/p"
|
||||||
|
}
|
||||||
|
|
||||||
|
_get_hpyerv_physical_driver() {
|
||||||
|
local _physical_nic
|
||||||
|
|
||||||
|
_physical_nic=$(find /sys/class/net/"$1"/ -name 'lower_*' | sed -En "s/\/.*lower_(.*)/\1/p")
|
||||||
|
[[ -n $_physical_nic ]] || return
|
||||||
|
_get_nic_driver "$_physical_nic"
|
||||||
|
}
|
||||||
|
|
||||||
|
kdump_install_nic_driver() {
|
||||||
|
local _netif _driver _drivers
|
||||||
|
|
||||||
|
_drivers=()
|
||||||
|
|
||||||
|
for _netif in $1; do
|
||||||
|
[[ $_netif == lo ]] && continue
|
||||||
|
_driver=$(_get_nic_driver "$_netif")
|
||||||
|
if [[ -z $_driver ]]; then
|
||||||
|
derror "Failed to get the driver of $_netif"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $_driver == "802.1Q VLAN Support" ]]; then
|
||||||
|
# ethtool somehow doesn't return the driver name for a VLAN NIC
|
||||||
|
_driver=8021q
|
||||||
|
elif [[ $_driver == "team" ]]; then
|
||||||
|
# install the team mode drivers like team_mode_roundrobin.ko as well
|
||||||
|
_driver='=drivers/net/team'
|
||||||
|
elif [[ $_driver == "hv_netvsc" ]]; then
|
||||||
|
# A Hyper-V VM may have accelerated networking
|
||||||
|
# https://learn.microsoft.com/en-us/azure/virtual-network/accelerated-networking-overview
|
||||||
|
# Install the driver of physical NIC as well
|
||||||
|
_drivers+=("$(_get_hpyerv_physical_driver "$_netif")")
|
||||||
|
fi
|
||||||
|
|
||||||
|
_drivers+=("$_driver")
|
||||||
|
done
|
||||||
|
|
||||||
|
[[ -n ${_drivers[*]} ]] || return
|
||||||
|
instmods "${_drivers[@]}"
|
||||||
|
}
|
||||||
|
|
||||||
kdump_setup_bridge() {
|
kdump_setup_bridge() {
|
||||||
local _netdev=$1
|
local _netdev=$1
|
||||||
local _brif _dev _mac _kdumpdev
|
local _brif _dev _mac _kdumpdev
|
||||||
for _dev in `ls /sys/class/net/$_netdev/brif/`; do
|
for _dev in `ls /sys/class/net/$_netdev/brif/`; do
|
||||||
_kdumpdev=$_dev
|
_kdumpdev=""
|
||||||
if kdump_is_bond "$_dev"; then
|
if kdump_is_bond "$_dev"; then
|
||||||
kdump_setup_bond "$_dev"
|
kdump_setup_bond "$_dev"
|
||||||
elif kdump_is_team "$_dev"; then
|
elif kdump_is_team "$_dev"; then
|
||||||
|
@ -206,6 +420,8 @@ kdump_setup_bridge() {
|
||||||
_kdumpdev=$(kdump_setup_ifname $_dev)
|
_kdumpdev=$(kdump_setup_ifname $_dev)
|
||||||
echo -n " ifname=$_kdumpdev:$_mac" >> ${initdir}/etc/cmdline.d/41bridge.conf
|
echo -n " ifname=$_kdumpdev:$_mac" >> ${initdir}/etc/cmdline.d/41bridge.conf
|
||||||
fi
|
fi
|
||||||
|
_save_kdump_netifs "$_dev" "$_kdumpdev"
|
||||||
|
[[ -z $_kdumpdev ]] && _kdumpdev=$_dev
|
||||||
_brif+="$_kdumpdev,"
|
_brif+="$_kdumpdev,"
|
||||||
done
|
done
|
||||||
echo " bridge=$_netdev:$(echo $_brif | sed -e 's/,$//')" >> ${initdir}/etc/cmdline.d/41bridge.conf
|
echo " bridge=$_netdev:$(echo $_brif | sed -e 's/,$//')" >> ${initdir}/etc/cmdline.d/41bridge.conf
|
||||||
|
@ -217,6 +433,7 @@ kdump_setup_bond() {
|
||||||
for _dev in `cat /sys/class/net/$_netdev/bonding/slaves`; do
|
for _dev in `cat /sys/class/net/$_netdev/bonding/slaves`; do
|
||||||
_mac=$(kdump_get_perm_addr $_dev)
|
_mac=$(kdump_get_perm_addr $_dev)
|
||||||
_kdumpdev=$(kdump_setup_ifname $_dev)
|
_kdumpdev=$(kdump_setup_ifname $_dev)
|
||||||
|
_save_kdump_netifs "$_dev" "$_kdumpdev"
|
||||||
echo -n " ifname=$_kdumpdev:$_mac" >> ${initdir}/etc/cmdline.d/42bond.conf
|
echo -n " ifname=$_kdumpdev:$_mac" >> ${initdir}/etc/cmdline.d/42bond.conf
|
||||||
_slaves+="$_kdumpdev,"
|
_slaves+="$_kdumpdev,"
|
||||||
done
|
done
|
||||||
|
@ -225,7 +442,7 @@ kdump_setup_bond() {
|
||||||
|
|
||||||
source_ifcfg_file $_netdev
|
source_ifcfg_file $_netdev
|
||||||
|
|
||||||
bondoptions="$(echo :$BONDING_OPTS | sed 's/\s\+/,/')"
|
bondoptions=":$(echo $BONDING_OPTS | xargs echo | tr " " ",")"
|
||||||
echo "$bondoptions" >> ${initdir}/etc/cmdline.d/42bond.conf
|
echo "$bondoptions" >> ${initdir}/etc/cmdline.d/42bond.conf
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -235,6 +452,7 @@ kdump_setup_team() {
|
||||||
for _dev in `teamnl $_netdev ports | awk -F':' '{print $2}'`; do
|
for _dev in `teamnl $_netdev ports | awk -F':' '{print $2}'`; do
|
||||||
_mac=$(kdump_get_perm_addr $_dev)
|
_mac=$(kdump_get_perm_addr $_dev)
|
||||||
_kdumpdev=$(kdump_setup_ifname $_dev)
|
_kdumpdev=$(kdump_setup_ifname $_dev)
|
||||||
|
_save_kdump_netifs "$_dev" "$_kdumpdev"
|
||||||
echo -n " ifname=$_kdumpdev:$_mac" >> ${initdir}/etc/cmdline.d/44team.conf
|
echo -n " ifname=$_kdumpdev:$_mac" >> ${initdir}/etc/cmdline.d/44team.conf
|
||||||
_slaves+="$_kdumpdev,"
|
_slaves+="$_kdumpdev,"
|
||||||
done
|
done
|
||||||
|
@ -258,57 +476,109 @@ kdump_setup_vlan() {
|
||||||
local _netmac="$(kdump_get_mac_addr $_phydev)"
|
local _netmac="$(kdump_get_mac_addr $_phydev)"
|
||||||
local _kdumpdev
|
local _kdumpdev
|
||||||
|
|
||||||
#Just support vlan over bond, it is not easy
|
#Just support vlan over bond and team
|
||||||
#to support all other complex setup
|
|
||||||
if kdump_is_bridge "$_phydev"; then
|
if kdump_is_bridge "$_phydev"; then
|
||||||
derror "Vlan over bridge is not supported!"
|
derror "Vlan over bridge is not supported!"
|
||||||
exit 1
|
exit 1
|
||||||
elif kdump_is_team "$_phydev"; then
|
|
||||||
derror "Vlan over team is not supported!"
|
|
||||||
exit 1
|
|
||||||
elif kdump_is_bond "$_phydev"; then
|
elif kdump_is_bond "$_phydev"; then
|
||||||
kdump_setup_bond "$_phydev"
|
kdump_setup_bond "$_phydev"
|
||||||
echo " vlan=$_netdev:$_phydev" > ${initdir}/etc/cmdline.d/43vlan.conf
|
echo " vlan=$(kdump_setup_ifname $_netdev):$_phydev" > ${initdir}/etc/cmdline.d/43vlan.conf
|
||||||
else
|
else
|
||||||
_kdumpdev="$(kdump_setup_ifname $_phydev)"
|
_kdumpdev="$(kdump_setup_ifname $_phydev)"
|
||||||
echo " vlan=$_netdev:$_kdumpdev ifname=$_kdumpdev:$_netmac" > ${initdir}/etc/cmdline.d/43vlan.conf
|
echo " vlan=$(kdump_setup_ifname $_netdev):$_kdumpdev ifname=$_kdumpdev:$_netmac" > ${initdir}/etc/cmdline.d/43vlan.conf
|
||||||
fi
|
fi
|
||||||
|
_save_kdump_netifs "$_phydev" "$_kdumpdev"
|
||||||
|
}
|
||||||
|
|
||||||
|
# find online znet device
|
||||||
|
# return ifname (_netdev)
|
||||||
|
# code reaped from the list_configured function of
|
||||||
|
# https://github.com/hreinecke/s390-tools/blob/master/zconf/znetconf
|
||||||
|
find_online_znet_device() {
|
||||||
|
local CCWGROUPBUS_DEVICEDIR="/sys/bus/ccwgroup/devices"
|
||||||
|
local NETWORK_DEVICES d ifname ONLINE
|
||||||
|
|
||||||
|
[ ! -d "$CCWGROUPBUS_DEVICEDIR" ] && return
|
||||||
|
NETWORK_DEVICES=$(find $CCWGROUPBUS_DEVICEDIR)
|
||||||
|
for d in $NETWORK_DEVICES
|
||||||
|
do
|
||||||
|
[ ! -f "$d/online" ] && continue
|
||||||
|
read ONLINE < $d/online
|
||||||
|
if [ $ONLINE -ne 1 ]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
# determine interface name, if there (only for qeth and if
|
||||||
|
# device is online)
|
||||||
|
if [ -f $d/if_name ]
|
||||||
|
then
|
||||||
|
read ifname < $d/if_name
|
||||||
|
elif [ -d $d/net ]
|
||||||
|
then
|
||||||
|
ifname=$(ls $d/net/)
|
||||||
|
fi
|
||||||
|
[ -n "$ifname" ] && break
|
||||||
|
done
|
||||||
|
echo -n "$ifname"
|
||||||
}
|
}
|
||||||
|
|
||||||
# setup s390 znet cmdline
|
# setup s390 znet cmdline
|
||||||
# $1: netdev name
|
# $1: netdev name
|
||||||
kdump_setup_znet() {
|
kdump_setup_znet() {
|
||||||
local _options=""
|
local _options=""
|
||||||
|
local _netdev=$1
|
||||||
|
|
||||||
source_ifcfg_file $1
|
source_ifcfg_file $_netdev
|
||||||
|
|
||||||
|
[[ -z "$NETTYPE" ]] && return
|
||||||
|
[[ -z "$SUBCHANNELS" ]] && return
|
||||||
|
|
||||||
for i in $OPTIONS; do
|
for i in $OPTIONS; do
|
||||||
_options=${_options},$i
|
_options=${_options},$i
|
||||||
done
|
done
|
||||||
echo rd.znet=${NETTYPE},${SUBCHANNELS}${_options} > ${initdir}/etc/cmdline.d/30znet.conf
|
echo rd.znet=${NETTYPE},${SUBCHANNELS}${_options} rd.znet_ifname=$(kdump_setup_ifname $_netdev):${SUBCHANNELS} > ${initdir}/etc/cmdline.d/30znet.conf
|
||||||
|
}
|
||||||
|
|
||||||
|
_get_nic_driver() {
|
||||||
|
ethtool -i "$1" | sed -n -E "s/driver: (.*)/\1/p"
|
||||||
|
}
|
||||||
|
|
||||||
|
_rename_hypver_netdev() {
|
||||||
|
local _udev_rule_dir
|
||||||
|
|
||||||
|
_udev_rule_dir=${initdir}/etc/udev/rules.d
|
||||||
|
mkdir -p "$_udev_rule_dir"
|
||||||
|
printf 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="hv_netvsc", ATTR{address}=="%s", ATTR{type}=="1", NAME="%s"\n' "$2" "$1" > "${_udev_rule_dir}/80-hv_netvsc-ifname.rules"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Setup dracut to bringup a given network interface
|
# Setup dracut to bringup a given network interface
|
||||||
kdump_setup_netdev() {
|
kdump_setup_netdev() {
|
||||||
local _netdev=$1 _srcaddr=$2
|
local _netdev=$1 _srcaddr=$2
|
||||||
local _static _proto _ip_conf _ip_opts _ifname_opts
|
local _static _proto _ip_conf _ip_opts _ifname_opts kdumpnic
|
||||||
local _netmac=$(kdump_get_mac_addr $_netdev)
|
local _netmac=$(kdump_get_mac_addr $_netdev)
|
||||||
|
local _znet_netdev
|
||||||
|
|
||||||
if [ "$(uname -m)" = "s390x" ]; then
|
kdumpnic=$(kdump_setup_ifname $_netdev)
|
||||||
kdump_setup_znet $_netdev
|
|
||||||
|
_znet_netdev=$(find_online_znet_device)
|
||||||
|
if [[ -n "$_znet_netdev" ]]; then
|
||||||
|
$(kdump_setup_znet "$_znet_netdev")
|
||||||
|
if [[ $? != 0 ]]; then
|
||||||
|
derror "Failed to set up znet"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
_static=$(kdump_static_ip $_netdev $_srcaddr)
|
_static=$(kdump_static_ip $_netdev $_srcaddr $kdumpnic)
|
||||||
if [ -n "$_static" ]; then
|
if [ -n "$_static" ]; then
|
||||||
_proto=none
|
_proto=none
|
||||||
elif is_ipv6_address $_srcaddr; then
|
elif is_ipv6_address $_srcaddr; then
|
||||||
_proto=either6
|
_proto=auto6
|
||||||
else
|
else
|
||||||
_proto=dhcp
|
_proto=dhcp
|
||||||
fi
|
fi
|
||||||
|
|
||||||
_ip_conf="${initdir}/etc/cmdline.d/40ip.conf"
|
_ip_conf="${initdir}/etc/cmdline.d/40ip.conf"
|
||||||
_ip_opts=" ip=${_static}$(kdump_setup_ifname $_netdev):${_proto}"
|
_ip_opts=" ip=${_static}$kdumpnic:${_proto}"
|
||||||
|
|
||||||
# dracut doesn't allow duplicated configuration for same NIC, even they're exactly the same.
|
# dracut doesn't allow duplicated configuration for same NIC, even they're exactly the same.
|
||||||
# so we have to avoid adding duplicates
|
# so we have to avoid adding duplicates
|
||||||
|
@ -328,11 +598,21 @@ kdump_setup_netdev() {
|
||||||
elif kdump_is_vlan "$_netdev"; then
|
elif kdump_is_vlan "$_netdev"; then
|
||||||
kdump_setup_vlan "$_netdev"
|
kdump_setup_vlan "$_netdev"
|
||||||
else
|
else
|
||||||
_ifname_opts=" ifname=$(kdump_setup_ifname $_netdev):$_netmac"
|
if [[ $(_get_nic_driver "$1") != hv_netvsc ]]; then
|
||||||
echo "$_ifname_opts" >> $_ip_conf
|
_ifname_opts=" ifname=$kdumpnic:$_netmac"
|
||||||
|
echo "$_ifname_opts" >> $_ip_conf
|
||||||
|
else
|
||||||
|
_rename_hypver_netdev "$kdumpnic" "$_netmac"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
_save_kdump_netifs "$_netdev" "$_kdumpdev"
|
||||||
|
|
||||||
kdump_setup_dns "$_netdev"
|
kdump_setup_dns "$_netdev"
|
||||||
|
|
||||||
|
if [ ! -f ${initdir}/etc/cmdline.d/50neednet.conf ]; then
|
||||||
|
# network-manager module needs this parameter
|
||||||
|
echo "rd.neednet" >> ${initdir}/etc/cmdline.d/50neednet.conf
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
get_ip_route_field()
|
get_ip_route_field()
|
||||||
|
@ -382,6 +662,29 @@ kdump_install_net() {
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# install etc/kdump/pre.d and /etc/kdump/post.d
|
||||||
|
kdump_install_pre_post_conf() {
|
||||||
|
if [ -d /etc/kdump/pre.d ]; then
|
||||||
|
for file in /etc/kdump/pre.d/*; do
|
||||||
|
if [ -x "$file" ]; then
|
||||||
|
dracut_install $file
|
||||||
|
elif [ $file != "/etc/kdump/pre.d/*" ]; then
|
||||||
|
echo "$file is not executable"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -d /etc/kdump/post.d ]; then
|
||||||
|
for file in /etc/kdump/post.d/*; do
|
||||||
|
if [ -x "$file" ]; then
|
||||||
|
dracut_install $file
|
||||||
|
elif [ $file != "/etc/kdump/post.d/*" ]; then
|
||||||
|
echo "$file is not executable"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
default_dump_target_install_conf()
|
default_dump_target_install_conf()
|
||||||
{
|
{
|
||||||
local _target _fstype
|
local _target _fstype
|
||||||
|
@ -389,24 +692,9 @@ default_dump_target_install_conf()
|
||||||
|
|
||||||
is_user_configured_dump_target && return
|
is_user_configured_dump_target && return
|
||||||
|
|
||||||
_save_path=$(get_option_value "path")
|
_save_path=$(get_bind_mount_source $(get_save_path))
|
||||||
[ -z "$_save_path" ] && _save_path=$DEFAULT_PATH
|
|
||||||
|
|
||||||
# strip the duplicated "/"
|
|
||||||
_save_path=$(echo $_save_path | tr -s /)
|
|
||||||
|
|
||||||
_mntpoint=$(get_mntpoint_from_path $_save_path)
|
|
||||||
_target=$(get_target_from_path $_save_path)
|
_target=$(get_target_from_path $_save_path)
|
||||||
|
_mntpoint=$(get_mntpoint_from_target $_target)
|
||||||
if is_atomic && is_bind_mount $_mntpoint; then
|
|
||||||
_save_path=${_save_path##"$_mntpoint"}
|
|
||||||
# the real dump path in the 2nd kernel, if the mount point is bind mounted.
|
|
||||||
_save_path=$(get_bind_mount_directory $_mntpoint)/$_save_path
|
|
||||||
_mntpoint=$(get_mntpoint_from_target $_target)
|
|
||||||
|
|
||||||
# the absolute path in the 1st kernel
|
|
||||||
_save_path=$_mntpoint/$_save_path
|
|
||||||
fi
|
|
||||||
|
|
||||||
_fstype=$(get_fs_type_from_target $_target)
|
_fstype=$(get_fs_type_from_target $_target)
|
||||||
if is_fs_type_nfs $_fstype; then
|
if is_fs_type_nfs $_fstype; then
|
||||||
|
@ -418,8 +706,6 @@ default_dump_target_install_conf()
|
||||||
|
|
||||||
echo "$_fstype $_target" >> ${initdir}/tmp/$$-kdump.conf
|
echo "$_fstype $_target" >> ${initdir}/tmp/$$-kdump.conf
|
||||||
|
|
||||||
# strip the duplicated "/"
|
|
||||||
_save_path=$(echo $_save_path | tr -s /)
|
|
||||||
# don't touch the path under root mount
|
# don't touch the path under root mount
|
||||||
if [ "$_mntpoint" != "/" ]; then
|
if [ "$_mntpoint" != "/" ]; then
|
||||||
_save_path=${_save_path##"$_mntpoint"}
|
_save_path=${_save_path##"$_mntpoint"}
|
||||||
|
@ -430,30 +716,6 @@ default_dump_target_install_conf()
|
||||||
echo "path $_save_path" >> ${initdir}/tmp/$$-kdump.conf
|
echo "path $_save_path" >> ${initdir}/tmp/$$-kdump.conf
|
||||||
}
|
}
|
||||||
|
|
||||||
adjust_bind_mount_path()
|
|
||||||
{
|
|
||||||
local _target=$1
|
|
||||||
local _save_path=$(get_option_value "path")
|
|
||||||
[ -z "$_save_path" ] && _save_path=$DEFAULT_PATH
|
|
||||||
|
|
||||||
# strip the duplicated "/"
|
|
||||||
_save_path=$(echo $_save_path | tr -s /)
|
|
||||||
|
|
||||||
local _absolute_save_path=$(get_mntpoint_from_target $_target)/$_save_path
|
|
||||||
_absolute_save_path=$(echo "$_absolute_save_path" | tr -s /)
|
|
||||||
local _mntpoint=$(get_mntpoint_from_path $_absolute_save_path)
|
|
||||||
|
|
||||||
if is_bind_mount $_mntpoint; then
|
|
||||||
_save_path=${_absolute_save_path##"$_mntpoint"}
|
|
||||||
# the real dump path in the 2nd kernel, if the mount point is bind mounted.
|
|
||||||
_save_path=$(get_bind_mount_directory $_mntpoint)/$_save_path
|
|
||||||
|
|
||||||
#erase the old path line, then insert the parsed path
|
|
||||||
sed -i "/^path/d" ${initdir}/tmp/$$-kdump.conf
|
|
||||||
echo "path $_save_path" >> ${initdir}/tmp/$$-kdump.conf
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
#install kdump.conf and what user specifies in kdump.conf
|
#install kdump.conf and what user specifies in kdump.conf
|
||||||
kdump_install_conf() {
|
kdump_install_conf() {
|
||||||
local _opt _val _pdev
|
local _opt _val _pdev
|
||||||
|
@ -470,9 +732,6 @@ kdump_install_conf() {
|
||||||
ext[234]|xfs|btrfs|minix)
|
ext[234]|xfs|btrfs|minix)
|
||||||
_pdev=$(kdump_get_persistent_dev $_val)
|
_pdev=$(kdump_get_persistent_dev $_val)
|
||||||
sed -i -e "s#^$_opt[[:space:]]\+$_val#$_opt $_pdev#" ${initdir}/tmp/$$-kdump.conf
|
sed -i -e "s#^$_opt[[:space:]]\+$_val#$_opt $_pdev#" ${initdir}/tmp/$$-kdump.conf
|
||||||
if is_atomic; then
|
|
||||||
adjust_bind_mount_path "$_val"
|
|
||||||
fi
|
|
||||||
;;
|
;;
|
||||||
ssh|nfs)
|
ssh|nfs)
|
||||||
kdump_install_net "$_val"
|
kdump_install_net "$_val"
|
||||||
|
@ -491,6 +750,8 @@ kdump_install_conf() {
|
||||||
esac
|
esac
|
||||||
done <<< "$(read_strip_comments /etc/kdump.conf)"
|
done <<< "$(read_strip_comments /etc/kdump.conf)"
|
||||||
|
|
||||||
|
kdump_install_pre_post_conf
|
||||||
|
|
||||||
default_dump_target_install_conf
|
default_dump_target_install_conf
|
||||||
|
|
||||||
kdump_configure_fence_kdump "${initdir}/tmp/$$-kdump.conf"
|
kdump_configure_fence_kdump "${initdir}/tmp/$$-kdump.conf"
|
||||||
|
@ -633,7 +894,7 @@ kdump_check_iscsi_targets () {
|
||||||
# If our prerequisites are not met, fail anyways.
|
# If our prerequisites are not met, fail anyways.
|
||||||
type -P iscsistart >/dev/null || return 1
|
type -P iscsistart >/dev/null || return 1
|
||||||
|
|
||||||
kdump_check_setup_iscsi() (
|
kdump_check_setup_iscsi() {
|
||||||
local _dev
|
local _dev
|
||||||
_dev=$1
|
_dev=$1
|
||||||
|
|
||||||
|
@ -643,13 +904,48 @@ kdump_check_iscsi_targets () {
|
||||||
cd ..
|
cd ..
|
||||||
done
|
done
|
||||||
[[ -d iscsi_session ]] && kdump_setup_iscsi_device "$PWD"
|
[[ -d iscsi_session ]] && kdump_setup_iscsi_device "$PWD"
|
||||||
)
|
}
|
||||||
|
|
||||||
[[ $hostonly ]] || [[ $mount_needs ]] && {
|
[[ $hostonly ]] || [[ $mount_needs ]] && {
|
||||||
for_each_host_dev_and_slaves_all kdump_check_setup_iscsi
|
for_each_host_dev_and_slaves_all kdump_check_setup_iscsi
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# hostname -a is deprecated, do it by ourself
|
||||||
|
get_alias() {
|
||||||
|
local ips
|
||||||
|
local entries
|
||||||
|
local alias_set
|
||||||
|
|
||||||
|
ips=$(hostname -I)
|
||||||
|
for ip in $ips
|
||||||
|
do
|
||||||
|
# in /etc/hosts, alias can come at the 2nd column
|
||||||
|
entries=$(grep $ip /etc/hosts | awk '{ $1=""; print $0 }')
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
alias_set="$alias_set $entries"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo $alias_set
|
||||||
|
}
|
||||||
|
|
||||||
|
is_localhost() {
|
||||||
|
local hostnames=$(hostname -A)
|
||||||
|
local shortnames=$(hostname -A -s)
|
||||||
|
local aliasname=$(get_alias)
|
||||||
|
local nodename=$1
|
||||||
|
|
||||||
|
hostnames="$hostnames $shortnames $aliasname"
|
||||||
|
|
||||||
|
for name in ${hostnames}; do
|
||||||
|
if [ "$name" == "$nodename" ]; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
# retrieves fence_kdump nodes from Pacemaker cluster configuration
|
# retrieves fence_kdump nodes from Pacemaker cluster configuration
|
||||||
get_pcs_fence_kdump_nodes() {
|
get_pcs_fence_kdump_nodes() {
|
||||||
local nodes
|
local nodes
|
||||||
|
@ -681,6 +977,21 @@ get_pcs_fence_kdump_args() {
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get_generic_fence_kdump_nodes() {
|
||||||
|
local filtered
|
||||||
|
local nodes
|
||||||
|
|
||||||
|
nodes=$(get_option_value "fence_kdump_nodes")
|
||||||
|
for node in ${nodes}; do
|
||||||
|
# Skip its own node name
|
||||||
|
if is_localhost $node; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
filtered="$filtered $node"
|
||||||
|
done
|
||||||
|
echo $filtered
|
||||||
|
}
|
||||||
|
|
||||||
# setup fence_kdump in cluster
|
# setup fence_kdump in cluster
|
||||||
# setup proper network and install needed files
|
# setup proper network and install needed files
|
||||||
kdump_configure_fence_kdump () {
|
kdump_configure_fence_kdump () {
|
||||||
|
@ -689,7 +1000,7 @@ kdump_configure_fence_kdump () {
|
||||||
local args
|
local args
|
||||||
|
|
||||||
if is_generic_fence_kdump; then
|
if is_generic_fence_kdump; then
|
||||||
nodes=$(get_option_value "fence_kdump_nodes")
|
nodes=$(get_generic_fence_kdump_nodes)
|
||||||
|
|
||||||
elif is_pcs_fence_kdump; then
|
elif is_pcs_fence_kdump; then
|
||||||
nodes=$(get_pcs_fence_kdump_nodes)
|
nodes=$(get_pcs_fence_kdump_nodes)
|
||||||
|
@ -736,9 +1047,33 @@ remove_cpu_online_rule() {
|
||||||
sed -i '/SUBSYSTEM=="cpu"/d' $file
|
sed -i '/SUBSYSTEM=="cpu"/d' $file
|
||||||
}
|
}
|
||||||
|
|
||||||
install() {
|
kdump_install_systemd_conf() {
|
||||||
local arch
|
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() {
|
||||||
|
declare -A unique_netifs
|
||||||
|
local arch _netifs
|
||||||
|
|
||||||
|
kdump_module_init
|
||||||
kdump_install_conf
|
kdump_install_conf
|
||||||
remove_sysctl_conf
|
remove_sysctl_conf
|
||||||
|
|
||||||
|
@ -766,11 +1101,15 @@ install() {
|
||||||
inst "/bin/head" "/bin/head"
|
inst "/bin/head" "/bin/head"
|
||||||
inst "/sbin/makedumpfile" "/sbin/makedumpfile"
|
inst "/sbin/makedumpfile" "/sbin/makedumpfile"
|
||||||
inst "/sbin/vmcore-dmesg" "/sbin/vmcore-dmesg"
|
inst "/sbin/vmcore-dmesg" "/sbin/vmcore-dmesg"
|
||||||
|
inst "/usr/bin/printf" "/sbin/printf"
|
||||||
|
inst "/usr/bin/logger" "/sbin/logger"
|
||||||
|
inst "/usr/bin/chmod" "/sbin/chmod"
|
||||||
inst "/lib/kdump/kdump-lib.sh" "/lib/kdump-lib.sh"
|
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-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.sh" "/usr/bin/kdump.sh"
|
||||||
inst "$moddir/kdump-capture.service" "$systemdsystemunitdir/kdump-capture.service"
|
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.sh" "/usr/bin/kdump-error-handler.sh"
|
||||||
inst "$moddir/kdump-error-handler.service" "$systemdsystemunitdir/kdump-error-handler.service"
|
inst "$moddir/kdump-error-handler.service" "$systemdsystemunitdir/kdump-error-handler.service"
|
||||||
# Replace existing emergency service and emergency target
|
# Replace existing emergency service and emergency target
|
||||||
|
@ -784,6 +1123,14 @@ install() {
|
||||||
# at some point of time.
|
# at some point of time.
|
||||||
kdump_check_iscsi_targets
|
kdump_check_iscsi_targets
|
||||||
|
|
||||||
|
_netifs=$(_get_kdump_netifs)
|
||||||
|
if [[ -n "$_netifs" ]]; then
|
||||||
|
kdump_install_nm_netif_allowlist "$_netifs"
|
||||||
|
kdump_install_nic_driver "$_netifs"
|
||||||
|
fi
|
||||||
|
|
||||||
|
kdump_install_systemd_conf
|
||||||
|
|
||||||
# For the lvm type target under kdump, in /etc/lvm/lvm.conf we can
|
# For the lvm type target under kdump, in /etc/lvm/lvm.conf we can
|
||||||
# safely replace "reserved_memory=XXXX"(default value is 8192) with
|
# safely replace "reserved_memory=XXXX"(default value is 8192) with
|
||||||
# "reserved_memory=1024" to lower memory pressure under kdump. We do
|
# "reserved_memory=1024" to lower memory pressure under kdump. We do
|
||||||
|
@ -793,12 +1140,15 @@ install() {
|
||||||
's/\(^[[:space:]]*reserved_memory[[:space:]]*=\)[[:space:]]*[[:digit:]]*/\1 1024/' \
|
's/\(^[[:space:]]*reserved_memory[[:space:]]*=\)[[:space:]]*[[:digit:]]*/\1 1024/' \
|
||||||
${initdir}/etc/lvm/lvm.conf &>/dev/null
|
${initdir}/etc/lvm/lvm.conf &>/dev/null
|
||||||
|
|
||||||
# Kdump turns out to require longer default systemd mount timeout
|
# Skip initrd-cleanup.service and initrd-parse-etc.service becasue we don't
|
||||||
# than 1st kernel(90s by default), we use default 300s for kdump.
|
# need to switch root. Instead of removing them, we use ConditionPathExists
|
||||||
grep -r "^[[:space:]]*DefaultTimeoutStartSec=" ${initdir}/etc/systemd/system.conf* &>/dev/null
|
# to check if /proc/vmcore exists to determine if we are in kdump.
|
||||||
if [ $? -ne 0 ]; then
|
sed -i '/\[Unit\]/a ConditionPathExists=!\/proc\/vmcore' \
|
||||||
mkdir -p ${initdir}/etc/systemd/system.conf.d
|
"${initdir}/${systemdsystemunitdir}/initrd-cleanup.service" &> /dev/null
|
||||||
echo "[Manager]" > ${initdir}/etc/systemd/system.conf.d/kdump.conf
|
|
||||||
echo "DefaultTimeoutStartSec=300s" >> ${initdir}/etc/systemd/system.conf.d/kdump.conf
|
sed -i '/\[Unit\]/a ConditionPathExists=!\/proc\/vmcore' \
|
||||||
fi
|
"${initdir}/${systemdsystemunitdir}/initrd-parse-etc.service" &> /dev/null
|
||||||
|
|
||||||
|
# Save more memory by dropping switch root capability
|
||||||
|
dracut_no_switch_root
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,12 +3,17 @@ Early Kdump HOWTO
|
||||||
Introduction
|
Introduction
|
||||||
------------
|
------------
|
||||||
|
|
||||||
Kdump service starts too late, so early crashes will have no chance to get
|
Early kdump is a mechanism to make kdump operational earlier than normal kdump
|
||||||
kdump kernel booting, this will cause crash information to be lost. It is
|
service. The kdump service starts early enough for general crash cases, but
|
||||||
necessary to add a dracut module in order to load crash kernel and initramfs
|
there are some cases where it has no chance to make kdump operational in boot
|
||||||
as early as possible. You can provide "rd.earlykdump" in grub commandline
|
sequence, such as detecting devices and starting early services. If you hit
|
||||||
to enable, then the early kdump will load those files like the normal kdump,
|
such a case, early kdump may allow you to get more information of it.
|
||||||
which is disabled by default.
|
|
||||||
|
Early kdump is implemented as a dracut module. It adds a kernel (vmlinuz) and
|
||||||
|
initramfs for kdump to your system's initramfs in order to load them as early
|
||||||
|
as possible. After that, if you provide "rd.earlykdump" in kernel command line,
|
||||||
|
then in the initramfs, early kdump will load those files like the normal kdump
|
||||||
|
service. This is disabled by default.
|
||||||
|
|
||||||
For the normal kdump service, it can check whether the early kdump has loaded
|
For the normal kdump service, it can check whether the early kdump has loaded
|
||||||
the crash kernel and initramfs. It has no conflict with the early kdump.
|
the crash kernel and initramfs. It has no conflict with the early kdump.
|
||||||
|
@ -20,7 +25,9 @@ We assume if you're reading this document, you should already have kexec-tools
|
||||||
installed.
|
installed.
|
||||||
|
|
||||||
You can rebuild the initramfs with earlykdump support with below steps:
|
You can rebuild the initramfs with earlykdump support with below steps:
|
||||||
|
|
||||||
1. start kdump service to make sure kdump initramfs is created.
|
1. start kdump service to make sure kdump initramfs is created.
|
||||||
|
|
||||||
# systemctl start kdump
|
# systemctl start kdump
|
||||||
|
|
||||||
NOTE: If a crash occurs during boot process, early kdump captures a vmcore
|
NOTE: If a crash occurs during boot process, early kdump captures a vmcore
|
||||||
|
@ -34,21 +41,14 @@ You can rebuild the initramfs with earlykdump support with below steps:
|
||||||
For the failure_action, you can choose anything other than "reboot".
|
For the failure_action, you can choose anything other than "reboot".
|
||||||
|
|
||||||
2. rebuild system initramfs with earlykdump support.
|
2. rebuild system initramfs with earlykdump support.
|
||||||
# dracut --add earlykdump
|
|
||||||
|
# dracut --force --add earlykdump
|
||||||
|
|
||||||
|
NOTE: Recommend to backup the original system initramfs before performing
|
||||||
|
this step to put it back if something happens during boot-up.
|
||||||
|
|
||||||
3. add rd.earlykdump in grub kernel command line.
|
3. add rd.earlykdump in grub kernel command line.
|
||||||
|
|
||||||
Note:
|
|
||||||
[1]. Early kdump initramfs size will be large because it includes vmlinuz and
|
|
||||||
kdump initramfs. And for step 2 if you are sure to overwrite system initramfs
|
|
||||||
you can backup the original initramfs and use "--force" option.
|
|
||||||
|
|
||||||
[2]. Early kdump inherits the settings of normal kdump, so any changes that
|
|
||||||
caused normal kdump rebuilding also require rebuilding the system initramfs
|
|
||||||
to make sure that the changes take effect for early kdump. Therefore, after
|
|
||||||
the rebuilding of kdump initramfs is completed, provide a prompt message to
|
|
||||||
tell the fact.
|
|
||||||
|
|
||||||
After making said changes, reboot your system to take effect. Of course, if you
|
After making said changes, reboot your system to take effect. Of course, if you
|
||||||
want to disable early kdump, you can simply remove "rd.earlykdump" from kernel
|
want to disable early kdump, you can simply remove "rd.earlykdump" from kernel
|
||||||
boot parameters in grub, and reboot system like above.
|
boot parameters in grub, and reboot system like above.
|
||||||
|
@ -56,19 +56,40 @@ boot parameters in grub, and reboot system like above.
|
||||||
Once the boot is completed, you can check the status of the early kdump support
|
Once the boot is completed, you can check the status of the early kdump support
|
||||||
on the command prompt:
|
on the command prompt:
|
||||||
|
|
||||||
# journalctl -x|grep early-kdump
|
# journalctl -b | grep early-kdump
|
||||||
|
|
||||||
Then, you will see some useful logs, for exapmle:
|
Then, you will see some useful logs, for example:
|
||||||
|
|
||||||
1. if early kdump is successful.
|
- if early kdump is successful.
|
||||||
Mar 09 09:57:56 localhost.localdomain dracut-cmdline[190]: early-kdump is enabled.
|
|
||||||
Mar 09 09:57:56 localhost.localdomain dracut-cmdline[190]: kexec: loaded early-
|
|
||||||
kdump kernel
|
|
||||||
|
|
||||||
2. if early kdump is disabled.
|
Mar 09 09:57:56 localhost dracut-cmdline[190]: early-kdump is enabled.
|
||||||
Mar 09 10:02:47 localhost.localdomain dracut-cmdline[189]: early-kdump is disabled.
|
Mar 09 09:57:56 localhost dracut-cmdline[190]: kexec: loaded early-kdump kernel
|
||||||
|
|
||||||
|
- if early kdump is disabled.
|
||||||
|
|
||||||
|
Mar 09 10:02:47 localhost dracut-cmdline[189]: early-kdump is disabled.
|
||||||
|
|
||||||
|
Notes
|
||||||
|
-----
|
||||||
|
|
||||||
|
- The size of early kdump initramfs will be large because it includes vmlinuz
|
||||||
|
and kdump initramfs.
|
||||||
|
|
||||||
|
- Early kdump inherits the settings of normal kdump, so any changes that
|
||||||
|
caused normal kdump rebuilding also require rebuilding the system initramfs
|
||||||
|
to make sure that the changes take effect for early kdump. Therefore, after
|
||||||
|
the rebuilding of kdump initramfs is completed, provide a prompt message to
|
||||||
|
tell the fact.
|
||||||
|
|
||||||
|
- If you install an updated kernel and reboot the system with it, the early
|
||||||
|
kdump will be disabled by default. To enable it with the new kernel, you
|
||||||
|
need to take the above steps again.
|
||||||
|
|
||||||
Limitation
|
Limitation
|
||||||
----------
|
----------
|
||||||
|
|
||||||
At present, early kdump doesn't support fadump.
|
- At present, early kdump doesn't support fadump.
|
||||||
|
|
||||||
|
- Early kdump loads a crash kernel and initramfs at the beginning of the
|
||||||
|
process in system's initramfs, so a crash at earlier than that (e.g. in
|
||||||
|
kernel initialization) cannot be captured even with the early kdump.
|
||||||
|
|
|
@ -0,0 +1,352 @@
|
||||||
|
Firmware assisted dump (fadump) HOWTO
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
|
||||||
|
Firmware assisted dump is a new feature in the 3.4 mainline kernel supported
|
||||||
|
only on powerpc architecture. The goal of firmware-assisted dump is to enable
|
||||||
|
the dump of a crashed system, and to do so from a fully-reset system, and to
|
||||||
|
minimize the total elapsed time until the system is back in production use. A
|
||||||
|
complete documentation on implementation can be found at
|
||||||
|
Documentation/powerpc/firmware-assisted-dump.txt in upstream linux kernel tree
|
||||||
|
from 3.4 version and above.
|
||||||
|
|
||||||
|
Please note that the firmware-assisted dump feature is only available on Power6
|
||||||
|
and above systems with recent firmware versions.
|
||||||
|
|
||||||
|
Overview
|
||||||
|
|
||||||
|
Fadump
|
||||||
|
|
||||||
|
Fadump is a robust kernel crash dumping mechanism to get reliable kernel crash
|
||||||
|
dump with assistance from firmware. This approach does not use kexec, instead
|
||||||
|
firmware assists in booting the kdump kernel while preserving memory contents.
|
||||||
|
Unlike kdump, the system is fully reset, and loaded with a fresh copy of the
|
||||||
|
kernel. In particular, PCI and I/O devices are reinitialized and are in a
|
||||||
|
clean, consistent state. This second kernel, often called a capture kernel,
|
||||||
|
boots with very little memory and captures the dump image.
|
||||||
|
|
||||||
|
The first kernel registers the sections of memory with the Power firmware for
|
||||||
|
dump preservation during OS initialization. These registered sections of memory
|
||||||
|
are reserved by the first kernel during early boot. When a system crashes, the
|
||||||
|
Power firmware fully resets the system, preserves all the system memory
|
||||||
|
contents, save the low memory (boot memory of size larger of 5% of system
|
||||||
|
RAM or 256MB) of RAM to the previous registered region. It will also save
|
||||||
|
system registers, and hardware PTE's.
|
||||||
|
|
||||||
|
Fadump is supported only on ppc64 platform. The standard kernel and capture
|
||||||
|
kernel are one and the same on ppc64.
|
||||||
|
|
||||||
|
If you're reading this document, you should already have kexec-tools
|
||||||
|
installed. If not, you install it via the following command:
|
||||||
|
|
||||||
|
# yum install kexec-tools
|
||||||
|
|
||||||
|
Fadump Operational Flow:
|
||||||
|
|
||||||
|
Like kdump, fadump also exports the ELF formatted kernel crash dump through
|
||||||
|
/proc/vmcore. Hence existing kdump infrastructure can be used to capture fadump
|
||||||
|
vmcore. The idea is to keep the functionality transparent to end user. From
|
||||||
|
user perspective there is no change in the way kdump init script works.
|
||||||
|
|
||||||
|
However, unlike kdump, fadump does not pre-load kdump kernel and initrd into
|
||||||
|
reserved memory, instead it always uses default OS initrd during second boot
|
||||||
|
after crash. Hence, for fadump, we rebuild the new kdump initrd and replace it
|
||||||
|
with default initrd. Before replacing existing default initrd we take a backup
|
||||||
|
of original default initrd for user's reference. The dracut package has been
|
||||||
|
enhanced to rebuild the default initrd with vmcore capture steps. The initrd
|
||||||
|
image is rebuilt as per the configuration in /etc/kdump.conf file.
|
||||||
|
|
||||||
|
The control flow of fadump works as follows:
|
||||||
|
01. System panics.
|
||||||
|
02. At the crash, kernel informs power firmware that kernel has crashed.
|
||||||
|
03. Firmware takes the control and reboots the entire system preserving
|
||||||
|
only the memory (resets all other devices).
|
||||||
|
04. The reboot follows the normal booting process (non-kexec).
|
||||||
|
05. The boot loader loads the default kernel and initrd from /boot
|
||||||
|
06. The default initrd loads and runs /init
|
||||||
|
07. dracut-kdump.sh script present in fadump aware default initrd checks if
|
||||||
|
'/proc/device-tree/rtas/ibm,kernel-dump' file exists before executing
|
||||||
|
steps to capture vmcore.
|
||||||
|
(This check will help to bypass the vmcore capture steps during normal boot
|
||||||
|
process.)
|
||||||
|
09. Captures dump according to /etc/kdump.conf
|
||||||
|
10. Is dump capture successful (yes goto 12, no goto 11)
|
||||||
|
11. Perform the failure action specified in /etc/kdump.conf
|
||||||
|
(The default failure action is reboot, if unspecified)
|
||||||
|
12. Perform the final action specified in /etc/kdump.conf
|
||||||
|
(The default final action is reboot, if unspecified)
|
||||||
|
|
||||||
|
|
||||||
|
How to configure fadump:
|
||||||
|
|
||||||
|
Again, we assume if you're reading this document, you should already have
|
||||||
|
kexec-tools installed. If not, you install it via the following command:
|
||||||
|
|
||||||
|
# yum install kexec-tools
|
||||||
|
|
||||||
|
Make the kernel to be configured with FADump as the default boot entry, if
|
||||||
|
it isn't already:
|
||||||
|
|
||||||
|
# grubby --set-default=/boot/vmlinuz-<kver>
|
||||||
|
|
||||||
|
Boot into the kernel to be configured for FADump. To be able to do much of
|
||||||
|
anything interesting in the way of debug analysis, you'll also need to install
|
||||||
|
the kernel-debuginfo package, of the same arch as your running kernel, and the
|
||||||
|
crash utility:
|
||||||
|
|
||||||
|
# yum --enablerepo=\*debuginfo install kernel-debuginfo.$(uname -m) crash
|
||||||
|
|
||||||
|
Next up, we need to modify some boot parameters to enable firmware assisted
|
||||||
|
dump. With the help of grubby, it's very easy to append "fadump=on" to the end
|
||||||
|
of your kernel boot parameters. To reserve the appropriate amount of memory
|
||||||
|
for boot memory preservation, pass 'crashkernel=X' kernel cmdline parameter.
|
||||||
|
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.
|
||||||
|
Alternatively, user can also specify boot memory size through boot parameter
|
||||||
|
'fadump_reserve_mem=' which will override the default calculated size. Use this
|
||||||
|
option if default boot memory size is not sufficient for second kernel to boot
|
||||||
|
successfully.
|
||||||
|
|
||||||
|
After making said changes, reboot your system, so that the specified memory is
|
||||||
|
reserved and left untouched by the normal system. Take note that the output of
|
||||||
|
'free -m' will show X MB less memory than without this parameter, which is
|
||||||
|
expected. If you see OOM (Out Of Memory) error messages while loading capture
|
||||||
|
kernel, then you should bump up the memory reservation size.
|
||||||
|
|
||||||
|
Now that you've got that reserved memory region set up, you want to turn on
|
||||||
|
the kdump init script:
|
||||||
|
|
||||||
|
# systemctl enable kdump.service
|
||||||
|
|
||||||
|
Then, start up kdump as well:
|
||||||
|
|
||||||
|
# systemctl start kdump.service
|
||||||
|
|
||||||
|
This should turn on the firmware assisted functionality in kernel by
|
||||||
|
echo'ing 1 to /sys/kernel/fadump_registered, leaving the system ready
|
||||||
|
to capture a vmcore upon crashing. For journaling filesystems like XFS an
|
||||||
|
additional step is required to ensure bootloader does not pick the
|
||||||
|
older initrd (without vmcore capture scripts):
|
||||||
|
|
||||||
|
* If /boot is a separate partition, run the below commands as the root user,
|
||||||
|
or as a user with CAP_SYS_ADMIN rights:
|
||||||
|
|
||||||
|
# fsfreeze -f
|
||||||
|
# fsfreeze -u
|
||||||
|
|
||||||
|
* If /boot is not a separate partition, reboot the system.
|
||||||
|
|
||||||
|
After reboot check if the kdump service is up and running with:
|
||||||
|
|
||||||
|
# systemctl status kdump.service
|
||||||
|
|
||||||
|
To test out whether FADump is configured properly, you can force-crash your
|
||||||
|
system by echo'ing a 'c' into /proc/sysrq-trigger:
|
||||||
|
|
||||||
|
# echo c > /proc/sysrq-trigger
|
||||||
|
|
||||||
|
You should see some panic output, followed by the system reset and booting into
|
||||||
|
fresh copy of kernel. When default initrd loads and runs /init, vmcore should
|
||||||
|
be copied out to disk (by default, in /var/crash/<YYYY.MM.DD-HH:MM:SS>/vmcore),
|
||||||
|
then the system rebooted back into your normal kernel.
|
||||||
|
|
||||||
|
Once back to your normal kernel, you can use the previously installed crash
|
||||||
|
kernel in conjunction with the previously installed kernel-debuginfo to
|
||||||
|
perform postmortem analysis:
|
||||||
|
|
||||||
|
# crash /usr/lib/debug/lib/modules/2.6.17-1.2621.el5/vmlinux
|
||||||
|
/var/crash/2006-08-23-15:34/vmcore
|
||||||
|
|
||||||
|
crash> bt
|
||||||
|
|
||||||
|
and so on...
|
||||||
|
|
||||||
|
Saving vmcore-dmesg.txt
|
||||||
|
-----------------------
|
||||||
|
Kernel log bufferes are one of the most important information available
|
||||||
|
in vmcore. Now before saving vmcore, kernel log bufferes are extracted
|
||||||
|
from /proc/vmcore and saved into a file vmcore-dmesg.txt. After
|
||||||
|
vmcore-dmesg.txt, vmcore is saved. Destination disk and directory for
|
||||||
|
vmcore-dmesg.txt is same as vmcore. Note that kernel log buffers will
|
||||||
|
not be available if dump target is raw device.
|
||||||
|
|
||||||
|
FADump Memory Requirements:
|
||||||
|
|
||||||
|
System Memory Recommended memory
|
||||||
|
--------------------- ----------------------
|
||||||
|
4 GB - 16 GB : 768 MB
|
||||||
|
16 GB - 64 GB : 1024 MB
|
||||||
|
64 GB - 128 GB : 2 GB
|
||||||
|
128 GB - 1 TB : 4 GB
|
||||||
|
1 TB - 2 TB : 6 GB
|
||||||
|
2 TB - 4 TB : 12 GB
|
||||||
|
4 TB - 8 TB : 20 GB
|
||||||
|
8 TB - 16 TB : 36 GB
|
||||||
|
16 TB - 32 TB : 64 GB
|
||||||
|
32 TB - 64 TB : 128 GB
|
||||||
|
64 TB & above : 180 GB
|
||||||
|
|
||||||
|
Things to remember:
|
||||||
|
|
||||||
|
1) The memory required to boot capture Kernel is a moving target that depends
|
||||||
|
on many factors like hardware attached to the system, kernel and modules in
|
||||||
|
use, packages installed and services enabled, there is no one-size-fits-all.
|
||||||
|
But the above recommendations are based on system memory. So, the above
|
||||||
|
recommendations for FADump come with a few assumptions, based on available
|
||||||
|
system memory, about the resources the system could have. So, please take
|
||||||
|
the recommendations with a pinch of salt and remember to try capturing dump
|
||||||
|
a few times to confirm that the system is configured successfully with dump
|
||||||
|
capturing support.
|
||||||
|
|
||||||
|
2) Though the memory requirements for FADump seem high, this memory is not
|
||||||
|
completely set aside but made available for userspace applications to use,
|
||||||
|
through the CMA allocator.
|
||||||
|
|
||||||
|
3) As the same initrd is used for booting production kernel as well as capture
|
||||||
|
kernel and with dump being captured in a restricted memory environment, few
|
||||||
|
optimizations (like not inclding network dracut module, disabling multipath
|
||||||
|
and such) are applied while building the initrd. In case, the production
|
||||||
|
environment needs these optimizations to be avoided, dracut_args option in
|
||||||
|
/etc/kdump.conf file could be leveraged. For example, if a user wishes for
|
||||||
|
network module to be included in the initrd, adding the below entry in
|
||||||
|
/etc/kdump.conf file and restarting kdump service would take care of it.
|
||||||
|
|
||||||
|
dracut_args --add "network"
|
||||||
|
|
||||||
|
4) If FADump is configured to capture vmcore to a remote dump target using SSH
|
||||||
|
or NFS protocol, the corresponding network interface '<interface-name>' is
|
||||||
|
renamed to 'kdump-<interface-name>', if it is generic (like *eth# or net#).
|
||||||
|
It happens because vmcore capture scripts in the initial RAM disk (initrd)
|
||||||
|
add the 'kdump-' prefix to the network interface name to secure persistent
|
||||||
|
naming. And as capture kernel and production kernel use the same initrd in
|
||||||
|
case of FADump, the interface name is changed for the production kernel too.
|
||||||
|
This is likely to impact network configuration setup for production kernel.
|
||||||
|
So, it is recommended to use a non-generic name for a network interface,
|
||||||
|
before setting up FADump to capture vmcore to a remote dump target based on
|
||||||
|
that network interface, to avoid running into network configuration issues.
|
||||||
|
|
||||||
|
Dump Triggering methods:
|
||||||
|
|
||||||
|
This section talks about the various ways, other than a Kernel Panic, in which
|
||||||
|
fadump can be triggered. The following methods assume that fadump is configured
|
||||||
|
on your system, with the scripts enabled as described in the section above.
|
||||||
|
|
||||||
|
1) AltSysRq C
|
||||||
|
|
||||||
|
FAdump can be triggered with the combination of the 'Alt','SysRq' and 'C'
|
||||||
|
keyboard keys. Please refer to the following link for more details:
|
||||||
|
|
||||||
|
https://fedoraproject.org/wiki/QA/Sysrq
|
||||||
|
|
||||||
|
In addition, on PowerPC boxes, fadump can also be triggered via Hardware
|
||||||
|
Management Console(HMC) using 'Ctrl', 'O' and 'C' keyboard keys.
|
||||||
|
|
||||||
|
2) Kernel OOPs
|
||||||
|
|
||||||
|
If we want to generate a dump everytime the Kernel OOPses, we can achieve this
|
||||||
|
by setting the 'Panic On OOPs' option as follows:
|
||||||
|
|
||||||
|
# echo 1 > /proc/sys/kernel/panic_on_oops
|
||||||
|
|
||||||
|
3) PowerPC specific methods:
|
||||||
|
|
||||||
|
On IBM PowerPC machines, issuing a soft reset invokes the XMON debugger(if
|
||||||
|
XMON is configured). To configure XMON one needs to compile the kernel with
|
||||||
|
the CONFIG_XMON and CONFIG_XMON_DEFAULT options, or by compiling with
|
||||||
|
CONFIG_XMON and booting the kernel with xmon=on option.
|
||||||
|
|
||||||
|
Following are the ways to remotely issue a soft reset on PowerPC boxes, which
|
||||||
|
would drop you to XMON. Pressing a 'X' (capital alphabet X) followed by an
|
||||||
|
'Enter' here will trigger the dump.
|
||||||
|
|
||||||
|
3.1) HMC
|
||||||
|
|
||||||
|
Hardware Management Console(HMC) available on Power4 and Power5 machines allow
|
||||||
|
partitions to be reset remotely. This is specially useful in hang situations
|
||||||
|
where the system is not accepting any keyboard inputs.
|
||||||
|
|
||||||
|
Once you have HMC configured, the following steps will enable you to trigger
|
||||||
|
fadump via a soft reset:
|
||||||
|
|
||||||
|
On Power4
|
||||||
|
Using GUI
|
||||||
|
|
||||||
|
* In the right pane, right click on the partition you wish to dump.
|
||||||
|
* Select "Operating System->Reset".
|
||||||
|
* Select "Soft Reset".
|
||||||
|
* Select "Yes".
|
||||||
|
|
||||||
|
Using HMC Commandline
|
||||||
|
|
||||||
|
# reset_partition -m <machine> -p <partition> -t soft
|
||||||
|
|
||||||
|
On Power5
|
||||||
|
Using GUI
|
||||||
|
|
||||||
|
* In the right pane, right click on the partition you wish to dump.
|
||||||
|
* Select "Restart Partition".
|
||||||
|
* Select "Dump".
|
||||||
|
* Select "OK".
|
||||||
|
|
||||||
|
Using HMC Commandline
|
||||||
|
|
||||||
|
# chsysstate -m <managed system name> -n <lpar name> -o dumprestart -r lpar
|
||||||
|
|
||||||
|
3.2) Blade Management Console for Blade Center
|
||||||
|
|
||||||
|
To initiate a dump operation, go to Power/Restart option under "Blade Tasks" in
|
||||||
|
the Blade Management Console. Select the corresponding blade for which you want
|
||||||
|
to initate the dump and then click "Restart blade with NMI". This issues a
|
||||||
|
system reset and invokes xmon debugger.
|
||||||
|
|
||||||
|
|
||||||
|
Advanced Setups & Failure action:
|
||||||
|
|
||||||
|
Kdump and fadump exhibit similar behavior in terms of setup & failure action.
|
||||||
|
For fadump advanced setup related information see section "Advanced Setups" in
|
||||||
|
"kexec-kdump-howto.txt" document. Refer to "Failure action" section in "kexec-
|
||||||
|
kdump-howto.txt" document for fadump failure action related information.
|
||||||
|
|
||||||
|
Compression and filtering
|
||||||
|
|
||||||
|
Refer "Compression and filtering" section in "kexec-kdump-howto.txt" document.
|
||||||
|
Compression and filtering are same for kdump & fadump.
|
||||||
|
|
||||||
|
|
||||||
|
Notes on rootfs mount:
|
||||||
|
Dracut is designed to mount rootfs by default. If rootfs mounting fails it
|
||||||
|
will refuse to go on. So fadump leaves rootfs mounting to dracut currently.
|
||||||
|
We make the assumtion that proper root= cmdline is being passed to dracut
|
||||||
|
initramfs for the time being. If you need modify "KDUMP_COMMANDLINE=" in
|
||||||
|
/etc/sysconfig/kdump, you will need to make sure that appropriate root=
|
||||||
|
options are copied from /proc/cmdline. In general it is best to append
|
||||||
|
command line options using "KDUMP_COMMANDLINE_APPEND=" instead of replacing
|
||||||
|
the original command line completely.
|
||||||
|
|
||||||
|
How to disable FADump:
|
||||||
|
|
||||||
|
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):
|
||||||
|
|
||||||
|
# grubby --update-kernel=/boot/vmlinuz-$kver --args="crashkernl=auto"
|
||||||
|
|
||||||
|
Reboot the system for the settings to take effect.
|
|
@ -1,3 +1,12 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# $1: target arch
|
||||||
|
|
||||||
|
|
||||||
|
SED_EXP=""
|
||||||
|
|
||||||
|
generate()
|
||||||
|
{
|
||||||
|
sed "$SED_EXP" << EOF
|
||||||
# This file contains a series of commands to perform (in order) in the kdump
|
# This file contains a series of commands to perform (in order) in the kdump
|
||||||
# kernel after a kernel crash in the crash kernel(1st kernel) has happened.
|
# kernel after a kernel crash in the crash kernel(1st kernel) has happened.
|
||||||
#
|
#
|
||||||
|
@ -21,7 +30,7 @@
|
||||||
# <mnt>/<path>/%HOST-%DATE/, supports DNS.
|
# <mnt>/<path>/%HOST-%DATE/, supports DNS.
|
||||||
#
|
#
|
||||||
# ssh <user@server>
|
# 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.
|
# supports DNS.
|
||||||
# NOTE: make sure the user has write permissions on the server.
|
# NOTE: make sure the user has write permissions on the server.
|
||||||
#
|
#
|
||||||
|
@ -62,9 +71,9 @@
|
||||||
# as the initrd will automatically be populated with a
|
# as the initrd will automatically be populated with a
|
||||||
# config file appropriate for the running kernel.
|
# config file appropriate for the running kernel.
|
||||||
# The default core_collector for raw/ssh dump is:
|
# 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:
|
# 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.
|
# "makedumpfile -F" will create a flattened vmcore.
|
||||||
# You need to use "makedumpfile -R" to rearrange the dump data to
|
# You need to use "makedumpfile -R" to rearrange the dump data to
|
||||||
|
@ -79,13 +88,21 @@
|
||||||
# or script after the vmcore dump process terminates.
|
# or script after the vmcore dump process terminates.
|
||||||
# The exit status of the current dump process is fed to
|
# The exit status of the current dump process is fed to
|
||||||
# the executable binary or script as its first argument.
|
# the executable binary or script as its first argument.
|
||||||
|
# All files under /etc/kdump/post.d are collectively sorted
|
||||||
|
# and executed in lexical order, before binary or script
|
||||||
|
# specified kdump_post parameter is executed.
|
||||||
#
|
#
|
||||||
# kdump_pre <binary | script>
|
# kdump_pre <binary | script>
|
||||||
# - Works like the "kdump_post" directive, but instead of running
|
# - Works like the "kdump_post" directive, but instead of running
|
||||||
# after the dump process, runs immediately before it.
|
# after the dump process, runs immediately before it.
|
||||||
# Exit status of this binary is interpreted as follows:
|
# Exit status of this binary is interpreted as follows:
|
||||||
# 0 - continue with dump process as usual
|
# 0 - continue with dump process as usual
|
||||||
# non 0 - reboot the system
|
# non 0 - run the final action (reboot/poweroff/halt)
|
||||||
|
# All files under /etc/kdump/pre.d are collectively sorted and
|
||||||
|
# executed in lexical order, after binary or script specified
|
||||||
|
# kdump_pre parameter is executed.
|
||||||
|
# Even if the binary or script in /etc/kdump/pre.d directory
|
||||||
|
# returns non 0 exit status, the processing is continued.
|
||||||
#
|
#
|
||||||
# extra_bins <binaries | shell scripts>
|
# extra_bins <binaries | shell scripts>
|
||||||
# - This directive allows you to specify additional binaries or
|
# - This directive allows you to specify additional binaries or
|
||||||
|
@ -158,10 +175,12 @@
|
||||||
#ext4 LABEL=/boot
|
#ext4 LABEL=/boot
|
||||||
#ext4 UUID=03138356-5e61-4ab3-b58e-27507ac41937
|
#ext4 UUID=03138356-5e61-4ab3-b58e-27507ac41937
|
||||||
#nfs my.server.com:/export/tmp
|
#nfs my.server.com:/export/tmp
|
||||||
|
#nfs [2001:db8::1:2:3:4]:/export/tmp
|
||||||
#ssh user@my.server.com
|
#ssh user@my.server.com
|
||||||
|
#ssh user@2001:db8::1:2:3:4
|
||||||
#sshkey /root/.ssh/kdump_id_rsa
|
#sshkey /root/.ssh/kdump_id_rsa
|
||||||
path /var/crash
|
path /var/crash
|
||||||
core_collector makedumpfile -l --message-level 1 -d 31
|
core_collector makedumpfile -l --message-level 7 -d 31
|
||||||
#core_collector scp
|
#core_collector scp
|
||||||
#kdump_post /var/crash/scripts/kdump-post.sh
|
#kdump_post /var/crash/scripts/kdump-post.sh
|
||||||
#kdump_pre /var/crash/scripts/kdump-pre.sh
|
#kdump_pre /var/crash/scripts/kdump-pre.sh
|
||||||
|
@ -173,3 +192,32 @@ core_collector makedumpfile -l --message-level 1 -d 31
|
||||||
#dracut_args --omit-drivers "cfg80211 snd" --add-drivers "ext2 ext3"
|
#dracut_args --omit-drivers "cfg80211 snd" --add-drivers "ext2 ext3"
|
||||||
#fence_kdump_args -p 7410 -f auto -c 0 -i 10
|
#fence_kdump_args -p 7410 -f auto -c 0 -i 10
|
||||||
#fence_kdump_nodes node1 node2
|
#fence_kdump_nodes node1 node2
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
update_param()
|
||||||
|
{
|
||||||
|
SED_EXP="${SED_EXP}s/^$1.*$/$1 $2/;"
|
||||||
|
}
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
aarch64)
|
||||||
|
;;
|
||||||
|
i386)
|
||||||
|
;;
|
||||||
|
ppc64)
|
||||||
|
;;
|
||||||
|
ppc64le)
|
||||||
|
;;
|
||||||
|
s390x)
|
||||||
|
update_param core_collector \
|
||||||
|
"makedumpfile -c --message-level 7 -d 31"
|
||||||
|
;;
|
||||||
|
x86_64)
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Warning: Unknown architecture '$1', using default kdump.conf template."
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
generate
|
|
@ -4,6 +4,7 @@
|
||||||
# http://www.freedesktop.org/wiki/Software/systemd/Generators/
|
# http://www.freedesktop.org/wiki/Software/systemd/Generators/
|
||||||
|
|
||||||
. /usr/lib/kdump/kdump-lib.sh
|
. /usr/lib/kdump/kdump-lib.sh
|
||||||
|
. /usr/lib/kdump/kdump-logger.sh
|
||||||
|
|
||||||
# If invokded with no arguments for testing purpose, output to /tmp to
|
# If invokded with no arguments for testing purpose, output to /tmp to
|
||||||
# avoid overriding the existing.
|
# avoid overriding the existing.
|
||||||
|
|
|
@ -1,10 +1,12 @@
|
||||||
# These variables and functions are useful in 2nd kernel
|
# These variables and functions are useful in 2nd kernel
|
||||||
|
|
||||||
. /lib/kdump-lib.sh
|
. /lib/kdump-lib.sh
|
||||||
|
. /lib/kdump-logger.sh
|
||||||
|
|
||||||
KDUMP_PATH="/var/crash"
|
KDUMP_PATH="/var/crash"
|
||||||
|
KDUMP_LOG_FILE="/run/initramfs/kexec-dmesg.log"
|
||||||
CORE_COLLECTOR=""
|
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"
|
DMESG_COLLECTOR="/sbin/vmcore-dmesg"
|
||||||
FAILURE_ACTION="systemctl reboot -f"
|
FAILURE_ACTION="systemctl reboot -f"
|
||||||
DATEDIR=`date +%Y-%m-%d-%T`
|
DATEDIR=`date +%Y-%m-%d-%T`
|
||||||
|
@ -18,6 +20,14 @@ KDUMP_CONF="/etc/kdump.conf"
|
||||||
KDUMP_PRE=""
|
KDUMP_PRE=""
|
||||||
KDUMP_POST=""
|
KDUMP_POST=""
|
||||||
NEWROOT="/sysroot"
|
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()
|
get_kdump_confs()
|
||||||
{
|
{
|
||||||
|
@ -56,13 +66,13 @@ get_kdump_confs()
|
||||||
FAILURE_ACTION="kdump_emergency_shell"
|
FAILURE_ACTION="kdump_emergency_shell"
|
||||||
;;
|
;;
|
||||||
reboot)
|
reboot)
|
||||||
FAILURE_ACTION="systemctl reboot -f"
|
FAILURE_ACTION="systemctl reboot -f && exit"
|
||||||
;;
|
;;
|
||||||
halt)
|
halt)
|
||||||
FAILURE_ACTION="halt"
|
FAILURE_ACTION="halt && exit"
|
||||||
;;
|
;;
|
||||||
poweroff)
|
poweroff)
|
||||||
FAILURE_ACTION="systemctl poweroff -f"
|
FAILURE_ACTION="systemctl poweroff -f && exit"
|
||||||
;;
|
;;
|
||||||
dump_to_rootfs)
|
dump_to_rootfs)
|
||||||
FAILURE_ACTION="dump_to_rootfs"
|
FAILURE_ACTION="dump_to_rootfs"
|
||||||
|
@ -93,36 +103,68 @@ get_kdump_confs()
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# dump_fs <mount point| device>
|
# 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
|
||||||
|
chmod 600 $KDUMP_LOG_FILE
|
||||||
|
}
|
||||||
|
|
||||||
|
# dump_fs <mount point>
|
||||||
dump_fs()
|
dump_fs()
|
||||||
{
|
{
|
||||||
|
local _exitcode
|
||||||
|
local _mp=$1
|
||||||
|
ddebug "dump_fs _mp=$_mp"
|
||||||
|
|
||||||
local _dev=$(findmnt -k -f -n -r -o SOURCE $1)
|
if ! is_mounted "$_mp"; then
|
||||||
local _mp=$(findmnt -k -f -n -r -o TARGET $1)
|
dinfo "dump path \"$_mp\" is not mounted, trying to mount..."
|
||||||
|
mount --target $_mp
|
||||||
echo "kdump: dump target is $_dev"
|
if [ $? -ne 0 ]; then
|
||||||
|
derror "failed to dump to \"$_mp\", it's not a mount point!"
|
||||||
if [ -z "$_mp" ]; then
|
return 1
|
||||||
echo "kdump: error: Dump target $_dev is not mounted."
|
fi
|
||||||
return 1
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Remove -F in makedumpfile case. We don't want a flat format dump here.
|
# 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"`
|
[[ $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
|
mount -o remount,rw $_mp || return 1
|
||||||
mkdir -p $_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR || return 1
|
mkdir -p $_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR || return 1
|
||||||
|
|
||||||
save_vmcore_dmesg_fs ${DMESG_COLLECTOR} "$_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/"
|
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"
|
dinfo "saving vmcore"
|
||||||
$CORE_COLLECTOR /proc/vmcore $_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/vmcore-incomplete || return 1
|
$CORE_COLLECTOR /proc/vmcore $_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/vmcore-incomplete
|
||||||
mv $_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/vmcore-incomplete $_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/vmcore
|
_exitcode=$?
|
||||||
sync
|
if [ $_exitcode -eq 0 ]; then
|
||||||
|
sync -f "$_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/vmcore-incomplete"
|
||||||
|
_sync_exitcode=$?
|
||||||
|
if [ $_sync_exitcode -eq 0 ]; then
|
||||||
|
mv "$_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/vmcore-incomplete" "$_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/vmcore"
|
||||||
|
dinfo "saving vmcore complete"
|
||||||
|
else
|
||||||
|
derror "sync vmcore failed, _exitcode:$_sync_exitcode"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
derror "saving vmcore failed, _exitcode:$_exitcode"
|
||||||
|
fi
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
echo "kdump: saving vmcore complete"
|
|
||||||
# improper kernel cmdline can cause the failure of echo, we can ignore this kind of failure
|
# improper kernel cmdline can cause the failure of echo, we can ignore this kind of failure
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
@ -131,47 +173,76 @@ save_vmcore_dmesg_fs() {
|
||||||
local _dmesg_collector=$1
|
local _dmesg_collector=$1
|
||||||
local _path=$2
|
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
|
$_dmesg_collector /proc/vmcore > ${_path}/vmcore-dmesg-incomplete.txt
|
||||||
_exitcode=$?
|
_exitcode=$?
|
||||||
if [ $_exitcode -eq 0 ]; then
|
if [ $_exitcode -eq 0 ]; then
|
||||||
mv ${_path}/vmcore-dmesg-incomplete.txt ${_path}/vmcore-dmesg.txt
|
mv ${_path}/vmcore-dmesg-incomplete.txt ${_path}/vmcore-dmesg.txt
|
||||||
|
chmod 600 ${_path}/vmcore-dmesg.txt
|
||||||
|
|
||||||
# Make sure file is on disk. There have been instances where later
|
# Make sure file is on disk. There have been instances where later
|
||||||
# saving vmcore failed and system rebooted without sync and there
|
# saving vmcore failed and system rebooted without sync and there
|
||||||
# was no vmcore-dmesg.txt available.
|
# was no vmcore-dmesg.txt available.
|
||||||
sync
|
sync
|
||||||
echo "kdump: saving vmcore-dmesg.txt complete"
|
dinfo "saving vmcore-dmesg.txt complete"
|
||||||
else
|
else
|
||||||
echo "kdump: saving vmcore-dmesg.txt failed"
|
derror "saving vmcore-dmesg.txt failed"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
save_opalcore_fs() {
|
||||||
|
local _path=$1
|
||||||
|
|
||||||
|
if [ ! -f $OPALCORE ]; then
|
||||||
|
# Check if we are on an old kernel that uses a different path
|
||||||
|
if [ -f /sys/firmware/opal/core ]; then
|
||||||
|
OPALCORE="/sys/firmware/opal/core"
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
dinfo "saving opalcore:$OPALCORE to ${_path}/opalcore"
|
||||||
|
cp $OPALCORE ${_path}/opalcore
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
derror "saving opalcore failed"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
sync
|
||||||
|
dinfo "saving opalcore complete"
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
dump_to_rootfs()
|
dump_to_rootfs()
|
||||||
{
|
{
|
||||||
|
|
||||||
echo "Kdump: trying to bring up rootfs device"
|
dinfo "Trying to bring up rootfs device"
|
||||||
systemctl start dracut-initqueue
|
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
|
systemctl start sysroot.mount
|
||||||
|
|
||||||
|
ddebug "NEWROOT=$NEWROOT"
|
||||||
|
|
||||||
dump_fs $NEWROOT
|
dump_fs $NEWROOT
|
||||||
}
|
}
|
||||||
|
|
||||||
kdump_emergency_shell()
|
kdump_emergency_shell()
|
||||||
{
|
{
|
||||||
echo "PS1=\"kdump:\\\${PWD}# \"" >/etc/profile
|
echo "PS1=\"kdump:\\\${PWD}# \"" >/etc/profile
|
||||||
|
ddebug "Switching to dracut emergency..."
|
||||||
/bin/dracut-emergency
|
/bin/dracut-emergency
|
||||||
rm -f /etc/profile
|
rm -f /etc/profile
|
||||||
}
|
}
|
||||||
|
|
||||||
do_failure_action()
|
do_failure_action()
|
||||||
{
|
{
|
||||||
echo "Kdump: Executing failure action $FAILURE_ACTION"
|
dinfo "Executing failure action $FAILURE_ACTION"
|
||||||
eval $FAILURE_ACTION
|
eval $FAILURE_ACTION
|
||||||
}
|
}
|
||||||
|
|
||||||
do_final_action()
|
do_final_action()
|
||||||
{
|
{
|
||||||
|
dinfo "Executing final action $FINAL_ACTION"
|
||||||
eval $FINAL_ACTION
|
eval $FINAL_ACTION
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,7 @@ DEFAULT_PATH="/var/crash/"
|
||||||
FENCE_KDUMP_CONFIG_FILE="/etc/sysconfig/fence_kdump"
|
FENCE_KDUMP_CONFIG_FILE="/etc/sysconfig/fence_kdump"
|
||||||
FENCE_KDUMP_SEND="/usr/libexec/fence_kdump_send"
|
FENCE_KDUMP_SEND="/usr/libexec/fence_kdump_send"
|
||||||
FADUMP_ENABLED_SYS_NODE="/sys/kernel/fadump_enabled"
|
FADUMP_ENABLED_SYS_NODE="/sys/kernel/fadump_enabled"
|
||||||
|
LVM_CONF="/etc/lvm/lvm.conf"
|
||||||
|
|
||||||
is_fadump_capable()
|
is_fadump_capable()
|
||||||
{
|
{
|
||||||
|
@ -19,13 +20,19 @@ is_fadump_capable()
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
perror_exit() {
|
is_squash_available() {
|
||||||
echo $@ >&2
|
for kmodule in squashfs overlay loop; do
|
||||||
exit 1
|
if [ -z "$KDUMP_KERNELVER" ]; then
|
||||||
|
modprobe --dry-run $kmodule &>/dev/null || return 1
|
||||||
|
else
|
||||||
|
modprobe -S $KDUMP_KERNELVER --dry-run $kmodule &>/dev/null || return 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
perror() {
|
perror_exit() {
|
||||||
echo $@ >&2
|
derror "$@"
|
||||||
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
is_ssh_dump_target()
|
is_ssh_dump_target()
|
||||||
|
@ -56,6 +63,15 @@ is_fs_dump_target()
|
||||||
egrep -q "^ext[234]|^xfs|^btrfs|^minix" /etc/kdump.conf
|
egrep -q "^ext[234]|^xfs|^btrfs|^minix" /etc/kdump.conf
|
||||||
}
|
}
|
||||||
|
|
||||||
|
is_lvm2_thinp_device()
|
||||||
|
{
|
||||||
|
_device_path=$1
|
||||||
|
_lvm2_thin_device=$(lvm lvs -S 'lv_layout=sparse && lv_layout=thin' \
|
||||||
|
--nosuffix --noheadings -o vg_name,lv_name "$_device_path" 2> /dev/null)
|
||||||
|
|
||||||
|
[ -n "$_lvm2_thin_device" ]
|
||||||
|
}
|
||||||
|
|
||||||
strip_comments()
|
strip_comments()
|
||||||
{
|
{
|
||||||
echo $@ | sed -e 's/\(.*\)#.*/\1/'
|
echo $@ | sed -e 's/\(.*\)#.*/\1/'
|
||||||
|
@ -121,21 +137,16 @@ get_user_configured_dump_disk()
|
||||||
|
|
||||||
get_root_fs_device()
|
get_root_fs_device()
|
||||||
{
|
{
|
||||||
local _target
|
findmnt -k -f -n -o SOURCE /
|
||||||
_target=$(findmnt -k -f -n -o SOURCE /)
|
|
||||||
[ -n "$_target" ] && echo $_target
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get_save_path()
|
get_save_path()
|
||||||
{
|
{
|
||||||
local _save_path=$(grep "^path" /etc/kdump.conf|awk '{print $2}')
|
local _save_path=$(awk '$1 == "path" {print $2}' /etc/kdump.conf)
|
||||||
if [ -z "$_save_path" ]; then
|
[ -z "$_save_path" ] && _save_path=$DEFAULT_PATH
|
||||||
_save_path=$DEFAULT_PATH
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo $_save_path
|
# strip the duplicated "/"
|
||||||
|
echo $_save_path | tr -s /
|
||||||
}
|
}
|
||||||
|
|
||||||
get_block_dump_target()
|
get_block_dump_target()
|
||||||
|
@ -160,6 +171,12 @@ is_dump_to_rootfs()
|
||||||
grep -E "^(failure_action|default)[[:space:]]dump_to_rootfs" /etc/kdump.conf >/dev/null
|
grep -E "^(failure_action|default)[[:space:]]dump_to_rootfs" /etc/kdump.conf >/dev/null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
is_lvm2_thinp_dump_target()
|
||||||
|
{
|
||||||
|
_target=$(get_block_dump_target)
|
||||||
|
[ -n "$_target" ] && is_lvm2_thinp_device "$_target"
|
||||||
|
}
|
||||||
|
|
||||||
get_failure_action_target()
|
get_failure_action_target()
|
||||||
{
|
{
|
||||||
local _target
|
local _target
|
||||||
|
@ -197,44 +214,39 @@ get_kdump_targets()
|
||||||
echo "$kdump_targets"
|
echo "$kdump_targets"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Return the bind mount source path, return the path itself if it's not bind mounted
|
||||||
|
# Eg. if /path/to/src is bind mounted to /mnt/bind, then:
|
||||||
|
# /mnt/bind -> /path/to/src, /mnt/bind/dump -> /path/to/src/dump
|
||||||
|
#
|
||||||
# findmnt uses the option "-v, --nofsroot" to exclusive the [/dir]
|
# findmnt uses the option "-v, --nofsroot" to exclusive the [/dir]
|
||||||
# in the SOURCE column for bind-mounts, then if $_mntpoint equals to
|
# in the SOURCE column for bind-mounts, then if $_mntpoint equals to
|
||||||
# $_mntpoint_nofsroot, the mountpoint is not bind mounted directory.
|
# $_mntpoint_nofsroot, the mountpoint is not bind mounted directory.
|
||||||
is_bind_mount()
|
#
|
||||||
{
|
|
||||||
local _mntpoint=$(findmnt $1 | tail -n 1 | awk '{print $2}')
|
|
||||||
local _mntpoint_nofsroot=$(findmnt -v $1 | tail -n 1 | awk '{print $2}')
|
|
||||||
|
|
||||||
if [[ $_mntpoint = $_mntpoint_nofsroot ]]; then
|
|
||||||
return 1
|
|
||||||
else
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Below is just an example for mount info
|
# Below is just an example for mount info
|
||||||
# /dev/mapper/atomicos-root[/ostree/deploy/rhel-atomic-host/var], if the
|
# /dev/mapper/atomicos-root[/ostree/deploy/rhel-atomic-host/var], if the
|
||||||
# directory is bind mounted. The former part represents the device path, rest
|
# directory is bind mounted. The former part represents the device path, rest
|
||||||
# part is the bind mounted directory which quotes by bracket "[]".
|
# part is the bind mounted directory which quotes by bracket "[]".
|
||||||
get_bind_mount_directory()
|
get_bind_mount_source()
|
||||||
{
|
{
|
||||||
local _mntpoint=$(findmnt $1 | tail -n 1 | awk '{print $2}')
|
local _path=$1
|
||||||
local _mntpoint_nofsroot=$(findmnt -v $1 | tail -n 1 | awk '{print $2}')
|
# In case it's a sub path in a mount point, get the mount point first
|
||||||
|
local _mnt_top=$(df $_path | tail -1 | awk '{print $NF}')
|
||||||
|
local _mntpoint=$(findmnt $_mnt_top | tail -n 1 | awk '{print $2}')
|
||||||
|
local _mntpoint_nofsroot=$(findmnt -v $_mnt_top | tail -n 1 | awk '{print $2}')
|
||||||
|
|
||||||
|
if [[ "$_mntpoint" = $_mntpoint_nofsroot ]]; then
|
||||||
|
echo $_path && return
|
||||||
|
fi
|
||||||
|
|
||||||
_mntpoint=${_mntpoint#*$_mntpoint_nofsroot}
|
_mntpoint=${_mntpoint#*$_mntpoint_nofsroot}
|
||||||
|
|
||||||
_mntpoint=${_mntpoint#[}
|
_mntpoint=${_mntpoint#[}
|
||||||
_mntpoint=${_mntpoint%]}
|
_mntpoint=${_mntpoint%]}
|
||||||
|
_path=${_path#$_mnt_top}
|
||||||
|
|
||||||
echo $_mntpoint
|
echo $_mntpoint$_path
|
||||||
}
|
|
||||||
|
|
||||||
get_mntpoint_from_path()
|
|
||||||
{
|
|
||||||
echo $(df $1 | tail -1 | awk '{print $NF}')
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Return the current underlaying device of a path, ignore bind mounts
|
||||||
get_target_from_path()
|
get_target_from_path()
|
||||||
{
|
{
|
||||||
local _target
|
local _target
|
||||||
|
@ -244,78 +256,84 @@ get_target_from_path()
|
||||||
echo $_target
|
echo $_target
|
||||||
}
|
}
|
||||||
|
|
||||||
get_fs_type_from_target()
|
is_mounted()
|
||||||
{
|
{
|
||||||
echo $(findmnt -k -f -n -r -o FSTYPE $1)
|
findmnt -k -n $1 &>/dev/null
|
||||||
}
|
}
|
||||||
|
|
||||||
# input: device path
|
get_mount_info()
|
||||||
# output: the general mount point
|
{
|
||||||
# find the general mount point, not the bind mounted point in atomic
|
local _info_type=$1 _src_type=$2 _src=$3; shift 3
|
||||||
# As general system, Use the previous code
|
local _info=$(findmnt -k -n -r -o $_info_type --$_src_type $_src $@)
|
||||||
#
|
|
||||||
# ERROR and EXIT:
|
[ -z "$_info" ] && [ -e "/etc/fstab" ] && _info=$(findmnt -s -n -r -o $_info_type --$_src_type $_src $@)
|
||||||
# the device can be umounted the general mount point, if one of the mount point is bind mounted
|
|
||||||
# For example:
|
echo $_info
|
||||||
# mount /dev/sda /mnt/
|
}
|
||||||
# mount -o bind /mnt/var /var
|
|
||||||
# umount /mnt
|
get_fs_type_from_target()
|
||||||
|
{
|
||||||
|
get_mount_info FSTYPE source $1 -f
|
||||||
|
}
|
||||||
|
|
||||||
|
get_mntopt_from_target()
|
||||||
|
{
|
||||||
|
get_mount_info OPTIONS source $1 -f
|
||||||
|
}
|
||||||
|
# Find the general mount point of a dump target, not the bind mount point
|
||||||
get_mntpoint_from_target()
|
get_mntpoint_from_target()
|
||||||
{
|
{
|
||||||
if is_atomic; then
|
# Expcilitly specify --source to findmnt could ensure non-bind mount is returned
|
||||||
for _mnt in $(findmnt -k -n -r -o TARGET $1)
|
get_mount_info TARGET source $1 -f
|
||||||
do
|
}
|
||||||
if ! is_bind_mount $_mnt; then
|
|
||||||
echo $_mnt
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
echo "Mount $1 firstly, without the bind mode" >&2
|
# Get the path where the target will be mounted in kdump kernel
|
||||||
exit 1
|
# $1: kdump target device
|
||||||
|
get_kdump_mntpoint_from_target()
|
||||||
|
{
|
||||||
|
local _mntpoint=$(get_mntpoint_from_target $1)
|
||||||
|
|
||||||
|
# mount under /sysroot if dump to root disk or mount under
|
||||||
|
# mount under /kdumproot if dump target is not mounted in first kernel
|
||||||
|
# mount under /kdumproot/$_mntpoint in other cases in 2nd kernel.
|
||||||
|
# systemd will be in charge to umount it.
|
||||||
|
if [ -z "$_mntpoint" ];then
|
||||||
|
_mntpoint="/kdumproot"
|
||||||
else
|
else
|
||||||
echo $(findmnt -k -f -n -r -o TARGET $1)
|
if [ "$_mntpoint" = "/" ];then
|
||||||
|
_mntpoint="/sysroot"
|
||||||
|
else
|
||||||
|
_mntpoint="/kdumproot/$_mntpoint"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# strip duplicated "/"
|
||||||
|
echo $_mntpoint | tr -s "/"
|
||||||
}
|
}
|
||||||
|
|
||||||
# get_option_value <option_name>
|
# get_option_value <option_name>
|
||||||
# retrieves value of option defined in kdump.conf
|
# retrieves value of option defined in kdump.conf
|
||||||
get_option_value() {
|
get_option_value() {
|
||||||
echo $(strip_comments `grep "^$1[[:space:]]\+" /etc/kdump.conf | tail -1 | cut -d\ -f2-`)
|
strip_comments `grep "^$1[[:space:]]\+" /etc/kdump.conf | tail -1 | cut -d\ -f2-`
|
||||||
}
|
}
|
||||||
|
|
||||||
#This function compose a absolute path with the mount
|
kdump_get_persistent_dev() {
|
||||||
#point and the relative $SAVE_PATH.
|
local dev="${1//\"/}"
|
||||||
#target is passed in as argument, could be UUID, LABEL,
|
|
||||||
#block device or even nfs server export of the form of
|
|
||||||
#"my.server.com:/tmp/export"?
|
|
||||||
#And possibly this could be used for both default case
|
|
||||||
#as well as when dump taret is specified. When dump
|
|
||||||
#target is not specified, then $target would be null.
|
|
||||||
make_absolute_save_path()
|
|
||||||
{
|
|
||||||
local _target=$1
|
|
||||||
local _mnt
|
|
||||||
|
|
||||||
[ -n $_target ] && _mnt=$(get_mntpoint_from_target $1)
|
case "$dev" in
|
||||||
_mnt="${_mnt}/$SAVE_PATH"
|
UUID=*)
|
||||||
|
dev=`blkid -U "${dev#UUID=}"`
|
||||||
# strip the duplicated "/"
|
;;
|
||||||
echo "$_mnt" | tr -s /
|
LABEL=*)
|
||||||
|
dev=`blkid -L "${dev#LABEL=}"`
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
echo $(get_persistent_dev "$dev")
|
||||||
}
|
}
|
||||||
|
|
||||||
check_save_path_fs()
|
is_ostree()
|
||||||
{
|
{
|
||||||
local _path=$1
|
test -f /run/ostree-booted
|
||||||
|
|
||||||
if [ ! -d $_path ]; then
|
|
||||||
perror_exit "Dump path $_path does not exist."
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
is_atomic()
|
|
||||||
{
|
|
||||||
grep -q "ostree" /proc/cmdline
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# fixme, try the best to decide whether the ipv6 addr is allocated by slaac or dhcp6
|
# fixme, try the best to decide whether the ipv6 addr is allocated by slaac or dhcp6
|
||||||
|
@ -462,28 +480,33 @@ get_ifcfg_filename() {
|
||||||
echo -n "${ifcfg_file}"
|
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
|
# returns 1 otherwise
|
||||||
is_wdt_mod_omitted() {
|
is_dracut_mod_omitted() {
|
||||||
local dracut_args
|
local dracut_args dracut_mod=$1
|
||||||
local ret=1
|
|
||||||
|
|
||||||
dracut_args=$(grep "^dracut_args" /etc/kdump.conf)
|
set -- $(grep "^dracut_args" /etc/kdump.conf)
|
||||||
[[ -z $dracut_args ]] && return $ret
|
while [ $# -gt 0 ]; do
|
||||||
|
case $1 in
|
||||||
|
-o|--omit)
|
||||||
|
[[ " ${2//[^[:alnum:]]/ } " == *" $dracut_mod "* ]] && return 0
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
eval set -- $dracut_args
|
return 1
|
||||||
while :; do
|
}
|
||||||
[[ -z $1 ]] && break
|
|
||||||
case $1 in
|
|
||||||
-o|--omit)
|
|
||||||
echo $2 | grep -qw "watchdog"
|
|
||||||
[[ $? == 0 ]] && ret=0
|
|
||||||
break
|
|
||||||
esac
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
|
|
||||||
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
|
# If "dracut_args" contains "--mount" information, use it
|
||||||
|
@ -506,13 +529,26 @@ get_dracut_args_target()
|
||||||
echo $1 | grep "\-\-mount" | sed "s/.*--mount .\(.*\)/\1/" | cut -d' ' -f1
|
echo $1 | grep "\-\-mount" | sed "s/.*--mount .\(.*\)/\1/" | cut -d' ' -f1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get_reserved_mem_size()
|
||||||
|
{
|
||||||
|
local reserved_mem_size=0
|
||||||
|
|
||||||
|
if is_fadump_capable; then
|
||||||
|
reserved_mem_size=$(< /sys/kernel/fadump/mem_reserved)
|
||||||
|
else
|
||||||
|
reserved_mem_size=$(< /sys/kernel/kexec_crash_size)
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "$reserved_mem_size"
|
||||||
|
}
|
||||||
|
|
||||||
check_crash_mem_reserved()
|
check_crash_mem_reserved()
|
||||||
{
|
{
|
||||||
local mem_reserved
|
local mem_reserved
|
||||||
|
|
||||||
mem_reserved=$(cat /sys/kernel/kexec_crash_size)
|
mem_reserved=$(get_reserved_mem_size)
|
||||||
if [ $mem_reserved -eq 0 ]; then
|
if [ $mem_reserved -eq 0 ]; then
|
||||||
echo "No memory reserved for crash kernel"
|
derror "No memory reserved for crash kernel"
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -522,7 +558,7 @@ check_crash_mem_reserved()
|
||||||
check_kdump_feasibility()
|
check_kdump_feasibility()
|
||||||
{
|
{
|
||||||
if [ ! -e /sys/kernel/kexec_crash_loaded ]; then
|
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
|
return 1
|
||||||
fi
|
fi
|
||||||
check_crash_mem_reserved
|
check_crash_mem_reserved
|
||||||
|
@ -532,7 +568,7 @@ check_kdump_feasibility()
|
||||||
check_current_kdump_status()
|
check_current_kdump_status()
|
||||||
{
|
{
|
||||||
if [ ! -f /sys/kernel/kexec_crash_loaded ];then
|
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
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -615,6 +651,18 @@ is_secure_boot_enforced()
|
||||||
local secure_boot_file setup_mode_file
|
local secure_boot_file setup_mode_file
|
||||||
local secure_boot_byte setup_mode_byte
|
local secure_boot_byte setup_mode_byte
|
||||||
|
|
||||||
|
# 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)
|
secure_boot_file=$(find /sys/firmware/efi/efivars -name SecureBoot-* 2>/dev/null)
|
||||||
setup_mode_file=$(find /sys/firmware/efi/efivars -name SetupMode-* 2>/dev/null)
|
setup_mode_file=$(find /sys/firmware/efi/efivars -name SetupMode-* 2>/dev/null)
|
||||||
|
|
||||||
|
@ -627,6 +675,11 @@ is_secure_boot_enforced()
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Detect secure boot on s390x
|
||||||
|
if [[ -e "/sys/firmware/ipl/secure" && "$(cat /sys/firmware/ipl/secure)" == "1" ]]; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -648,8 +701,7 @@ prepare_kexec_args()
|
||||||
found_elf_args=`echo $kexec_args | grep elf32-core-headers`
|
found_elf_args=`echo $kexec_args | grep elf32-core-headers`
|
||||||
if [ -n "$found_elf_args" ]
|
if [ -n "$found_elf_args" ]
|
||||||
then
|
then
|
||||||
echo -n "Warning: elf32-core-headers overrides correct elf64 setting"
|
dwarn "Warning: elf32-core-headers overrides correct elf64 setting"
|
||||||
echo
|
|
||||||
else
|
else
|
||||||
kexec_args="$kexec_args --elf64-core-headers"
|
kexec_args="$kexec_args --elf64-core-headers"
|
||||||
fi
|
fi
|
||||||
|
@ -661,27 +713,151 @@ prepare_kexec_args()
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# For secureboot enabled machines, use new kexec file based syscall.
|
||||||
|
# Old syscall will always fail as it does not have capability to do
|
||||||
|
# kernel signature verification.
|
||||||
|
if is_secure_boot_enforced; then
|
||||||
|
dinfo "Secure Boot is enabled. Using kexec file based syscall."
|
||||||
|
kexec_args="$kexec_args -s"
|
||||||
|
fi
|
||||||
|
|
||||||
echo $kexec_args
|
echo $kexec_args
|
||||||
}
|
}
|
||||||
|
|
||||||
check_boot_dir()
|
# prepare_kdump_kernel <kdump_kernelver>
|
||||||
|
# This function return kdump_kernel given a kernel version.
|
||||||
|
prepare_kdump_kernel()
|
||||||
{
|
{
|
||||||
local kdump_bootdir=$1
|
local kdump_kernelver=$1
|
||||||
#If user specify a boot dir for kdump kernel, let's use it. Otherwise
|
local dir img boot_dirlist boot_imglist kdump_kernel machine_id
|
||||||
#check whether it's a atomic host. If yes parse the subdirectory under
|
read -r machine_id < /etc/machine-id
|
||||||
#/boot; If not just find it under /boot.
|
|
||||||
if [ -n "$kdump_bootdir" ]; then
|
boot_dirlist=${KDUMP_BOOTDIR:-"/boot /boot/efi /efi /"}
|
||||||
echo "$kdump_bootdir"
|
boot_imglist="$KDUMP_IMG-$kdump_kernelver$KDUMP_IMG_EXT $machine_id/$kdump_kernelver/$KDUMP_IMG"
|
||||||
return
|
|
||||||
|
# The kernel of OSTree based systems is not in the standard locations.
|
||||||
|
if is_ostree; then
|
||||||
|
boot_dirlist="$(echo /boot/ostree/*) $boot_dirlist"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! is_atomic || [ "$(uname -m)" = "s390x" ]; then
|
# Use BOOT_IMAGE as reference if possible, strip the GRUB root device prefix in (hd0,gpt1) format
|
||||||
kdump_bootdir="/boot"
|
boot_img="$(grep -P -o '^BOOT_IMAGE=(\S+)' /proc/cmdline | sed "s/^BOOT_IMAGE=\((\S*)\)\?\(\S*\)/\2/")"
|
||||||
else
|
if [[ "$boot_img" == *"$kdump_kernelver" ]]; then
|
||||||
eval $(cat /proc/cmdline| grep "BOOT_IMAGE" | cut -d' ' -f1)
|
boot_imglist="$boot_img $boot_imglist"
|
||||||
kdump_bootdir="/boot"$(dirname $BOOT_IMAGE)
|
|
||||||
fi
|
fi
|
||||||
echo $kdump_bootdir
|
|
||||||
|
for dir in $boot_dirlist; do
|
||||||
|
for img in $boot_imglist; do
|
||||||
|
if [[ -f "$dir/$img" ]]; then
|
||||||
|
kdump_kernel=$(echo "$dir/$img" | tr -s '/')
|
||||||
|
break 2
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
done
|
||||||
|
echo "$kdump_kernel"
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Detect initrd and kernel location, results are stored in global enviromental variables:
|
||||||
|
# KDUMP_BOOTDIR, KDUMP_KERNELVER, KDUMP_KERNEL, DEFAULT_INITRD, and KDUMP_INITRD
|
||||||
|
#
|
||||||
|
# Expectes KDUMP_BOOTDIR, KDUMP_IMG, KDUMP_IMG_EXT, KDUMP_KERNELVER to be loaded from config already
|
||||||
|
# and will prefer already set values so user can specify custom kernel/initramfs location
|
||||||
|
#
|
||||||
|
prepare_kdump_bootinfo()
|
||||||
|
{
|
||||||
|
local boot_initrdlist nondebug_kernelver debug_kernelver
|
||||||
|
local default_initrd_base var_target_initrd_dir
|
||||||
|
|
||||||
|
if [[ -z $KDUMP_KERNELVER ]]; then
|
||||||
|
KDUMP_KERNELVER=$(uname -r)
|
||||||
|
|
||||||
|
# Fadump uses the regular bootloader, unlike kdump. So, use the same version
|
||||||
|
# for default kernel and capture kernel unless specified explicitly with
|
||||||
|
# KDUMP_KERNELVER option.
|
||||||
|
if ! is_fadump_capable; then
|
||||||
|
nondebug_kernelver=$(sed -n -e 's/\(.*\)+debug$/\1/p' <<< "$KDUMP_KERNELVER")
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Use nondebug kernel if possible, because debug kernel will consume more memory and may oom.
|
||||||
|
if [[ -n $nondebug_kernelver ]]; then
|
||||||
|
dinfo "Trying to use $nondebug_kernelver."
|
||||||
|
debug_kernelver=$KDUMP_KERNELVER
|
||||||
|
KDUMP_KERNELVER=$nondebug_kernelver
|
||||||
|
fi
|
||||||
|
|
||||||
|
KDUMP_KERNEL=$(prepare_kdump_kernel "$KDUMP_KERNELVER")
|
||||||
|
|
||||||
|
if ! [[ -e $KDUMP_KERNEL ]]; then
|
||||||
|
if [[ -n $debug_kernelver ]]; then
|
||||||
|
dinfo "Fallback to using debug kernel"
|
||||||
|
KDUMP_KERNELVER=$debug_kernelver
|
||||||
|
KDUMP_KERNEL=$(prepare_kdump_kernel "$KDUMP_KERNELVER")
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! [[ -e $KDUMP_KERNEL ]]; then
|
||||||
|
derror "Failed to detect kdump kernel location"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$KDUMP_KERNEL" == *"+debug" ]]; then
|
||||||
|
dwarn "Using debug kernel, you may need to set a larger crashkernel than the default value."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Set KDUMP_BOOTDIR to where kernel image is stored
|
||||||
|
KDUMP_BOOTDIR=$(dirname "$KDUMP_KERNEL")
|
||||||
|
|
||||||
|
# Default initrd should just stay aside of kernel image, try to find it in KDUMP_BOOTDIR
|
||||||
|
boot_initrdlist="initramfs-$KDUMP_KERNELVER.img initrd"
|
||||||
|
for initrd in $boot_initrdlist; do
|
||||||
|
if [[ -f "$KDUMP_BOOTDIR/$initrd" ]]; then
|
||||||
|
default_initrd_base="$initrd"
|
||||||
|
DEFAULT_INITRD="$KDUMP_BOOTDIR/$default_initrd_base"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Create kdump initrd basename from default initrd basename
|
||||||
|
# initramfs-5.7.9-200.fc32.x86_64.img => initramfs-5.7.9-200.fc32.x86_64kdump.img
|
||||||
|
# initrd => initrdkdump
|
||||||
|
if [[ -z $default_initrd_base ]]; then
|
||||||
|
kdump_initrd_base=initramfs-${KDUMP_KERNELVER}kdump.img
|
||||||
|
elif [[ $default_initrd_base == *.* ]]; then
|
||||||
|
kdump_initrd_base=${default_initrd_base%.*}kdump.${DEFAULT_INITRD##*.}
|
||||||
|
else
|
||||||
|
kdump_initrd_base=${default_initrd_base}kdump
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Place kdump initrd in $(/var/lib/kdump) if $(KDUMP_BOOTDIR) not writable
|
||||||
|
if [[ ! -w $KDUMP_BOOTDIR ]]; then
|
||||||
|
var_target_initrd_dir="/var/lib/kdump"
|
||||||
|
mkdir -p "$var_target_initrd_dir"
|
||||||
|
KDUMP_INITRD="$var_target_initrd_dir/$kdump_initrd_base"
|
||||||
|
else
|
||||||
|
KDUMP_INITRD="$KDUMP_BOOTDIR/$kdump_initrd_base"
|
||||||
|
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
|
||||||
}
|
}
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -725,5 +901,213 @@ prepare_cmdline()
|
||||||
if [ ! -z ${id} ] ; then
|
if [ ! -z ${id} ] ; then
|
||||||
cmdline=$(append_cmdline "${cmdline}" disable_cpu_apicid ${id})
|
cmdline=$(append_cmdline "${cmdline}" disable_cpu_apicid ${id})
|
||||||
fi
|
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}
|
echo ${cmdline}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#get system memory size in the unit of GB
|
||||||
|
get_system_size()
|
||||||
|
{
|
||||||
|
result=$(cat /proc/iomem | grep "System RAM" | awk -F ":" '{ print $1 }' | tr [:lower:] [:upper:] | paste -sd+)
|
||||||
|
result="+$result"
|
||||||
|
# replace '-' with '+0x' and '+' with '-0x'
|
||||||
|
sum=$( echo $result | sed -e 's/-/K0x/g' | sed -e 's/+/-0x/g' | sed -e 's/K/+/g' )
|
||||||
|
size=$(printf "%d\n" $(($sum)))
|
||||||
|
|
||||||
|
# in MB unit
|
||||||
|
let size=$size/1024/1024
|
||||||
|
# since RHEL-8.5 kernel round up total memory to 128M, so should user space
|
||||||
|
let size=($size+127)/128
|
||||||
|
let size=$size*128
|
||||||
|
# in GB unit
|
||||||
|
let size=$size/1024
|
||||||
|
|
||||||
|
echo $size
|
||||||
|
}
|
||||||
|
|
||||||
|
get_recommend_size()
|
||||||
|
{
|
||||||
|
local mem_size=$1
|
||||||
|
local _ck_cmdline=$2
|
||||||
|
local OLDIFS="$IFS"
|
||||||
|
|
||||||
|
last_sz=""
|
||||||
|
last_unit=""
|
||||||
|
|
||||||
|
start=${_ck_cmdline: :1}
|
||||||
|
if [ $mem_size -lt $start ]; then
|
||||||
|
echo "0M"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
IFS=','
|
||||||
|
for i in $_ck_cmdline; do
|
||||||
|
end=$(echo $i | awk -F "-" '{ print $2 }' | awk -F ":" '{ print $1 }')
|
||||||
|
recommend=$(echo $i | awk -F "-" '{ print $2 }' | awk -F ":" '{ print $2 }')
|
||||||
|
size=${end: : -1}
|
||||||
|
unit=${end: -1}
|
||||||
|
if [ $unit == 'T' ]; then
|
||||||
|
let size=$size*1024
|
||||||
|
fi
|
||||||
|
if [ $mem_size -lt $size ]; then
|
||||||
|
echo $recommend
|
||||||
|
IFS="$OLDIFS"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
IFS="$OLDIFS"
|
||||||
|
}
|
||||||
|
|
||||||
|
# return recommended size based on current system RAM size
|
||||||
|
kdump_get_arch_recommend_size()
|
||||||
|
{
|
||||||
|
if ! [[ -r "/proc/iomem" ]] ; then
|
||||||
|
echo "Error, can not access /proc/iomem."
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
arch=$(lscpu | grep Architecture | awk -F ":" '{ print $2 }' | tr [:lower:] [:upper:])
|
||||||
|
|
||||||
|
if [ $arch == "X86_64" ] || [ $arch == "S390X" ]; then
|
||||||
|
ck_cmdline="1G-4G:160M,4G-64G:192M,64G-1T:256M,1T-:512M"
|
||||||
|
elif [ $arch == "AARCH64" ]; then
|
||||||
|
ck_cmdline="2G-:448M"
|
||||||
|
elif [ $arch == "PPC64LE" ]; then
|
||||||
|
if is_fadump_capable; then
|
||||||
|
ck_cmdline="4G-16G:768M,16G-64G:1G,64G-128G:2G,128G-1T:4G,1T-2T:6G,2T-4T:12G,4T-8T:20G,8T-16T:36G,16T-32T:64G,32T-64T:128G,64T-:180G"
|
||||||
|
else
|
||||||
|
ck_cmdline="2G-4G:384M,4G-16G:512M,16G-64G:1G,64G-128G:2G,128G-:4G"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
ck_cmdline=$(echo $ck_cmdline | sed -e 's/-:/-102400T:/g')
|
||||||
|
sys_mem=$(get_system_size)
|
||||||
|
result=$(get_recommend_size $sys_mem "$ck_cmdline")
|
||||||
|
echo $result
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# Print all underlying crypt devices of a block device
|
||||||
|
# print nothing if device is not on top of a crypt device
|
||||||
|
# $1: the block device to be checked in maj:min format
|
||||||
|
get_luks_crypt_dev()
|
||||||
|
{
|
||||||
|
local _type
|
||||||
|
|
||||||
|
[[ -b /dev/block/$1 ]] || return 1
|
||||||
|
|
||||||
|
_type=$(blkid -u filesystem,crypto -o export -- "/dev/block/$1" | \
|
||||||
|
sed -n -E "s/^TYPE=(.*)$/\1/p")
|
||||||
|
[[ $_type == "crypto_LUKS" ]] && echo $1
|
||||||
|
|
||||||
|
for _x in /sys/dev/block/$1/slaves/*; do
|
||||||
|
[[ -f $_x/dev ]] || continue
|
||||||
|
[[ $_x/subsystem -ef /sys/class/block ]] || continue
|
||||||
|
get_luks_crypt_dev "$(< "$_x/dev")"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# kdump_get_maj_min <device>
|
||||||
|
# Prints the major and minor of a device node.
|
||||||
|
# Example:
|
||||||
|
# $ get_maj_min /dev/sda2
|
||||||
|
# 8:2
|
||||||
|
kdump_get_maj_min() {
|
||||||
|
local _majmin
|
||||||
|
_majmin="$(stat -L -c '%t:%T' "$1" 2> /dev/null)"
|
||||||
|
printf "%s" "$((0x${_majmin%:*})):$((0x${_majmin#*:}))"
|
||||||
|
}
|
||||||
|
|
||||||
|
get_all_kdump_crypt_dev()
|
||||||
|
{
|
||||||
|
local _dev _crypt
|
||||||
|
|
||||||
|
for _dev in $(get_block_dump_target); do
|
||||||
|
_crypt=$(get_luks_crypt_dev $(kdump_get_maj_min "$_dev"))
|
||||||
|
[[ -n "$_crypt" ]] && echo $_crypt
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
check_vmlinux()
|
||||||
|
{
|
||||||
|
# Use readelf to check if it's a valid ELF
|
||||||
|
readelf -h $1 &>/dev/null || return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
get_vmlinux_size()
|
||||||
|
{
|
||||||
|
local size=0
|
||||||
|
|
||||||
|
while read _type _offset _virtaddr _physaddr _fsize _msize _flg _aln; do
|
||||||
|
size=$(( $size + $_msize ))
|
||||||
|
done <<< $(readelf -l -W $1 | grep "^ LOAD" 2>/dev/stderr)
|
||||||
|
|
||||||
|
echo $size
|
||||||
|
}
|
||||||
|
|
||||||
|
try_decompress()
|
||||||
|
{
|
||||||
|
# The obscure use of the "tr" filter is to work around older versions of
|
||||||
|
# "grep" that report the byte offset of the line instead of the pattern.
|
||||||
|
|
||||||
|
# Try to find the header ($1) and decompress from here
|
||||||
|
for pos in `tr "$1\n$2" "\n$2=" < "$4" | grep -abo "^$2"`
|
||||||
|
do
|
||||||
|
if ! type -P $3 > /dev/null; then
|
||||||
|
ddebug "Signiature detected but '$3' is missing, skip this decompressor"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
|
||||||
|
pos=${pos%%:*}
|
||||||
|
tail -c+$pos "$img" | $3 > $5 2> /dev/null
|
||||||
|
if check_vmlinux $5; then
|
||||||
|
ddebug "Kernel is extracted with '$3'"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Borrowed from linux/scripts/extract-vmlinux
|
||||||
|
get_kernel_size()
|
||||||
|
{
|
||||||
|
# Prepare temp files:
|
||||||
|
local img=$1 tmp=$(mktemp /tmp/vmlinux-XXX)
|
||||||
|
trap "rm -f $tmp" 0
|
||||||
|
|
||||||
|
# Try to check if it's a vmlinux already
|
||||||
|
check_vmlinux $img && get_vmlinux_size $img && return 0
|
||||||
|
|
||||||
|
# That didn't work, so retry after decompression.
|
||||||
|
try_decompress '\037\213\010' xy gunzip $img $tmp || \
|
||||||
|
try_decompress '\3757zXZ\000' abcde unxz $img $tmp || \
|
||||||
|
try_decompress 'BZh' xy bunzip2 $img $tmp || \
|
||||||
|
try_decompress '\135\0\0\0' xxx unlzma $img $tmp || \
|
||||||
|
try_decompress '\211\114\132' xy 'lzop -d' $img $tmp || \
|
||||||
|
try_decompress '\002!L\030' xxx 'lz4 -d' $img $tmp || \
|
||||||
|
try_decompress '(\265/\375' xxx unzstd $img $tmp
|
||||||
|
|
||||||
|
# Finally check for uncompressed images or objects:
|
||||||
|
[[ $? -eq 0 ]] && get_vmlinux_size $tmp && return 0
|
||||||
|
|
||||||
|
# Fallback to use iomem
|
||||||
|
local _size=0
|
||||||
|
for _seg in $(cat /proc/iomem | grep -E "Kernel (code|rodata|data|bss)" | cut -d ":" -f 1); do
|
||||||
|
_size=$(( $_size + 0x${_seg#*-} - 0x${_seg%-*} ))
|
||||||
|
done
|
||||||
|
echo $_size
|
||||||
|
}
|
||||||
|
|
|
@ -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 || :
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
systemctl is-active kdump
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
/usr/lib/kdump/kdump-restart.sh
|
|
@ -0,0 +1,8 @@
|
||||||
|
#!/bin/bash
|
||||||
|
export PATH="$PATH:/usr/bin:/usr/sbin"
|
||||||
|
|
||||||
|
exec >>/var/log/kdump-migration.log 2>&1
|
||||||
|
|
||||||
|
echo "kdump: Partition Migration detected. Rebuilding initramfs image to reload."
|
||||||
|
/usr/bin/kdumpctl rebuild
|
||||||
|
/usr/bin/kdumpctl reload
|
|
@ -85,9 +85,9 @@ for the running kernel.
|
||||||
.PP
|
.PP
|
||||||
Note 1: About default core collector:
|
Note 1: About default core collector:
|
||||||
The default core_collector for raw/ssh dump is:
|
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:
|
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
|
Even if core_collector option is commented out in kdump.conf, makedumpfile
|
||||||
is the default core collector and kdump uses it internally.
|
is the default core collector and kdump uses it internally.
|
||||||
If one does not want makedumpfile as default core_collector, then they
|
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
|
dump data from standard input to a normal dumpfile (readable with analysis
|
||||||
tools).
|
tools).
|
||||||
ie. "makedumpfile -R vmcore < vmcore.flat"
|
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
|
.RE
|
||||||
|
|
||||||
|
@ -109,8 +114,15 @@ status of the current dump process is fed to the kdump_post
|
||||||
executable as its first argument($1). Executable can modify
|
executable as its first argument($1). Executable can modify
|
||||||
it to indicate the new exit status of succeeding dump process,
|
it to indicate the new exit status of succeeding dump process,
|
||||||
.PP
|
.PP
|
||||||
Note that scripts written for use with this directive must use
|
All files under /etc/kdump/post.d are collectively sorted
|
||||||
the /bin/bash interpreter.
|
and executed in lexical order, before binary or script
|
||||||
|
specified kdump_post parameter is executed.
|
||||||
|
.PP
|
||||||
|
Note that scripts written for use with this directive must use the /bin/bash
|
||||||
|
interpreter. And since these scripts run in kdump enviroment, the reference to
|
||||||
|
the storage or network device in the scripts should adhere to the section
|
||||||
|
\'Supported dump target types and requirements\' in kexec-kdump-howto.txt.
|
||||||
|
|
||||||
.RE
|
.RE
|
||||||
|
|
||||||
.B kdump_pre <binary | script>
|
.B kdump_pre <binary | script>
|
||||||
|
@ -122,10 +134,19 @@ as follows:
|
||||||
.PP
|
.PP
|
||||||
0 - continue with dump process as usual
|
0 - continue with dump process as usual
|
||||||
.PP
|
.PP
|
||||||
non 0 - reboot the system
|
non 0 - run the final action (reboot/poweroff/halt)
|
||||||
.PP
|
.PP
|
||||||
Note that scripts written for this directive must use
|
All files under /etc/kdump/pre.d are collectively sorted and
|
||||||
the /bin/bash interpreter.
|
executed in lexical order, after binary or script specified
|
||||||
|
kdump_pre parameter is executed.
|
||||||
|
Even if the binary or script in /etc/kdump/pre.d directory
|
||||||
|
returns non 0 exit status, the processing is continued.
|
||||||
|
.PP
|
||||||
|
Note that scripts written for use with this directive must use the /bin/bash
|
||||||
|
interpreter. And since these scripts run in kdump enviroment, the reference to
|
||||||
|
the storage or network device in the scripts should adhere to the section
|
||||||
|
\'Supported dump target types and requirements\' in kexec-kdump-howto.txt.
|
||||||
|
|
||||||
.RE
|
.RE
|
||||||
|
|
||||||
.B extra_bins <binaries | shell scripts>
|
.B extra_bins <binaries | shell scripts>
|
||||||
|
@ -275,7 +296,7 @@ retaining blacklist option creates more confusing behavior. It has been
|
||||||
deprecated.
|
deprecated.
|
||||||
.PP
|
.PP
|
||||||
Instead, use rd.driver.blacklist option on second kernel to blacklist
|
Instead, use rd.driver.blacklist option on second kernel to blacklist
|
||||||
a certain module. One can edit /etc/sysconfig/kdump.conf and edit
|
a certain module. One can edit /etc/sysconfig/kdump and edit
|
||||||
KDUMP_COMMANDLINE_APPEND to pass kernel command line options. Refer
|
KDUMP_COMMANDLINE_APPEND to pass kernel command line options. Refer
|
||||||
to dracut.cmdline man page for more details on module blacklist option.
|
to dracut.cmdline man page for more details on module blacklist option.
|
||||||
.RE
|
.RE
|
||||||
|
@ -297,11 +318,11 @@ Above will effectively be translated to:
|
||||||
cp --sparse=always /proc/vmcore <dest-path>/vmcore
|
cp --sparse=always /proc/vmcore <dest-path>/vmcore
|
||||||
.TP
|
.TP
|
||||||
ex2.
|
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:
|
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
|
.PP
|
||||||
For dump targets like raw and ssh, in general, core collector should expect
|
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
|
one argument (source file) and should output the processed core on standard
|
||||||
|
@ -318,11 +339,11 @@ Above will effectively be translated to.
|
||||||
cat /proc/vmcore | dd of=<target-device>
|
cat /proc/vmcore | dd of=<target-device>
|
||||||
.TP
|
.TP
|
||||||
ex4.
|
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.
|
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
|
.PP
|
||||||
ssh dumps examples
|
ssh dumps examples
|
||||||
.TP
|
.TP
|
||||||
|
@ -334,11 +355,11 @@ Above will effectively be translated to.
|
||||||
cat /proc/vmcore | ssh <options> <remote-location> "dd of=path/vmcore"
|
cat /proc/vmcore | ssh <options> <remote-location> "dd of=path/vmcore"
|
||||||
.TP
|
.TP
|
||||||
ex6.
|
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.
|
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
|
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
|
scp. As scp can handle ssh destinations for file transfers, one can
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
Description=Crash recovery kernel arming
|
Description=Crash recovery kernel arming
|
||||||
After=network.target network-online.target remote-fs.target basic.target
|
After=network.target network-online.target remote-fs.target basic.target
|
||||||
DefaultDependencies=no
|
DefaultDependencies=no
|
||||||
|
ConditionKernelCommandLine=crashkernel
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=oneshot
|
Type=oneshot
|
||||||
|
|
|
@ -17,7 +17,7 @@ KDUMP_COMMANDLINE=""
|
||||||
# This variable lets us remove arguments from the current kdump commandline
|
# This variable lets us remove arguments from the current kdump commandline
|
||||||
# as taken from either KDUMP_COMMANDLINE above, or from /proc/cmdline
|
# as taken from either KDUMP_COMMANDLINE above, or from /proc/cmdline
|
||||||
# NOTE: some arguments such as crashkernel will always be removed
|
# NOTE: some arguments such as crashkernel will always be removed
|
||||||
KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet"
|
KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet log_buf_len ignition.firstboot"
|
||||||
|
|
||||||
# This variable lets us append arguments to the current kdump commandline
|
# This variable lets us append arguments to the current kdump commandline
|
||||||
# after processed by KDUMP_COMMANDLINE_REMOVE
|
# after processed by KDUMP_COMMANDLINE_REMOVE
|
||||||
|
@ -35,3 +35,19 @@ KEXEC_ARGS=""
|
||||||
|
|
||||||
#What is the image type used for kdump
|
#What is the image type used for kdump
|
||||||
KDUMP_IMG="vmlinuz"
|
KDUMP_IMG="vmlinuz"
|
||||||
|
|
||||||
|
# Logging is controlled by following 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)
|
||||||
|
#
|
||||||
|
# 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: add the rd.kdumploglvl=3 option to KDUMP_COMMANDLINE_APPEND
|
||||||
|
#
|
||||||
|
# Logging levels: no logging(0), error(1),warn(2),info(3),debug(4)
|
||||||
|
#
|
||||||
|
# KDUMP_STDLOGLVL=3
|
||||||
|
# KDUMP_SYSLOGLVL=0
|
||||||
|
# KDUMP_KMSGLOGLVL=0
|
||||||
|
|
|
@ -17,7 +17,7 @@ KDUMP_COMMANDLINE=""
|
||||||
# This variable lets us remove arguments from the current kdump commandline
|
# This variable lets us remove arguments from the current kdump commandline
|
||||||
# as taken from either KDUMP_COMMANDLINE above, or from /proc/cmdline
|
# as taken from either KDUMP_COMMANDLINE above, or from /proc/cmdline
|
||||||
# NOTE: some arguments such as crashkernel will always be removed
|
# NOTE: some arguments such as crashkernel will always be removed
|
||||||
KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet"
|
KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet log_buf_len swiotlb ignition.firstboot"
|
||||||
|
|
||||||
# This variable lets us append arguments to the current kdump commandline
|
# This variable lets us append arguments to the current kdump commandline
|
||||||
# after processed by KDUMP_COMMANDLINE_REMOVE
|
# after processed by KDUMP_COMMANDLINE_REMOVE
|
||||||
|
@ -28,10 +28,26 @@ KDUMP_COMMANDLINE_APPEND="irqpoll nr_cpus=1 reset_devices cgroup_disable=memory
|
||||||
#
|
#
|
||||||
# Example:
|
# Example:
|
||||||
# KEXEC_ARGS="--elf32-core-headers"
|
# KEXEC_ARGS="--elf32-core-headers"
|
||||||
KEXEC_ARGS=""
|
KEXEC_ARGS="-s"
|
||||||
|
|
||||||
#Where to find the boot image
|
#Where to find the boot image
|
||||||
#KDUMP_BOOTDIR="/boot"
|
#KDUMP_BOOTDIR="/boot"
|
||||||
|
|
||||||
#What is the image type used for kdump
|
#What is the image type used for kdump
|
||||||
KDUMP_IMG="vmlinuz"
|
KDUMP_IMG="vmlinuz"
|
||||||
|
|
||||||
|
# Logging is controlled by following 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)
|
||||||
|
#
|
||||||
|
# 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: add the rd.kdumploglvl=3 option to KDUMP_COMMANDLINE_APPEND
|
||||||
|
#
|
||||||
|
# Logging levels: no logging(0), error(1),warn(2),info(3),debug(4)
|
||||||
|
#
|
||||||
|
# KDUMP_STDLOGLVL=3
|
||||||
|
# KDUMP_SYSLOGLVL=0
|
||||||
|
# KDUMP_KMSGLOGLVL=0
|
||||||
|
|
|
@ -17,7 +17,7 @@ KDUMP_COMMANDLINE=""
|
||||||
# This variable lets us remove arguments from the current kdump commandline
|
# This variable lets us remove arguments from the current kdump commandline
|
||||||
# as taken from either KDUMP_COMMANDLINE above, or from /proc/cmdline
|
# as taken from either KDUMP_COMMANDLINE above, or from /proc/cmdline
|
||||||
# NOTE: some arguments such as crashkernel will always be removed
|
# NOTE: some arguments such as crashkernel will always be removed
|
||||||
KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet"
|
KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet log_buf_len swiotlb ignition.firstboot"
|
||||||
|
|
||||||
# This variable lets us append arguments to the current kdump commandline
|
# This variable lets us append arguments to the current kdump commandline
|
||||||
# after processed by KDUMP_COMMANDLINE_REMOVE
|
# after processed by KDUMP_COMMANDLINE_REMOVE
|
||||||
|
@ -38,3 +38,19 @@ KDUMP_IMG="vmlinuz"
|
||||||
|
|
||||||
#What is the images extension. Relocatable kernels don't have one
|
#What is the images extension. Relocatable kernels don't have one
|
||||||
KDUMP_IMG_EXT=""
|
KDUMP_IMG_EXT=""
|
||||||
|
|
||||||
|
# Logging is controlled by following 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)
|
||||||
|
#
|
||||||
|
# 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: add the rd.kdumploglvl=3 option to KDUMP_COMMANDLINE_APPEND
|
||||||
|
#
|
||||||
|
# Logging levels: no logging(0), error(1),warn(2),info(3),debug(4)
|
||||||
|
#
|
||||||
|
# KDUMP_STDLOGLVL=3
|
||||||
|
# KDUMP_SYSLOGLVL=0
|
||||||
|
# KDUMP_KMSGLOGLVL=0
|
||||||
|
|
|
@ -17,7 +17,7 @@ KDUMP_COMMANDLINE=""
|
||||||
# This variable lets us remove arguments from the current kdump commandline
|
# This variable lets us remove arguments from the current kdump commandline
|
||||||
# as taken from either KDUMP_COMMANDLINE above, or from /proc/cmdline
|
# as taken from either KDUMP_COMMANDLINE above, or from /proc/cmdline
|
||||||
# NOTE: some arguments such as crashkernel will always be removed
|
# NOTE: some arguments such as crashkernel will always be removed
|
||||||
KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet"
|
KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet log_buf_len swiotlb ignition.firstboot"
|
||||||
|
|
||||||
# This variable lets us append arguments to the current kdump commandline
|
# This variable lets us append arguments to the current kdump commandline
|
||||||
# after processed by KDUMP_COMMANDLINE_REMOVE
|
# after processed by KDUMP_COMMANDLINE_REMOVE
|
||||||
|
@ -40,3 +40,19 @@ KDUMP_IMG="vmlinuz"
|
||||||
KDUMP_IMG_EXT=""
|
KDUMP_IMG_EXT=""
|
||||||
|
|
||||||
#Specify the action after failure
|
#Specify the action after failure
|
||||||
|
|
||||||
|
# Logging is controlled by following 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)
|
||||||
|
#
|
||||||
|
# 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: add the rd.kdumploglvl=3 option to KDUMP_COMMANDLINE_APPEND
|
||||||
|
#
|
||||||
|
# Logging levels: no logging(0), error(1),warn(2),info(3),debug(4)
|
||||||
|
#
|
||||||
|
# KDUMP_STDLOGLVL=3
|
||||||
|
# KDUMP_SYSLOGLVL=0
|
||||||
|
# KDUMP_KMSGLOGLVL=0
|
||||||
|
|
|
@ -17,7 +17,7 @@ KDUMP_COMMANDLINE=""
|
||||||
# This variable lets us remove arguments from the current kdump commandline
|
# This variable lets us remove arguments from the current kdump commandline
|
||||||
# as taken from either KDUMP_COMMANDLINE above, or from /proc/cmdline
|
# as taken from either KDUMP_COMMANDLINE above, or from /proc/cmdline
|
||||||
# NOTE: some arguments such as crashkernel will always be removed
|
# NOTE: some arguments such as crashkernel will always be removed
|
||||||
KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet"
|
KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet log_buf_len swiotlb ignition.firstboot"
|
||||||
|
|
||||||
# This variable lets us append arguments to the current kdump commandline
|
# This variable lets us append arguments to the current kdump commandline
|
||||||
# after processed by KDUMP_COMMANDLINE_REMOVE
|
# after processed by KDUMP_COMMANDLINE_REMOVE
|
||||||
|
@ -40,3 +40,19 @@ KDUMP_IMG="vmlinuz"
|
||||||
KDUMP_IMG_EXT=""
|
KDUMP_IMG_EXT=""
|
||||||
|
|
||||||
#Specify the action after failure
|
#Specify the action after failure
|
||||||
|
|
||||||
|
# Logging is controlled by following 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)
|
||||||
|
#
|
||||||
|
# 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: add the rd.kdumploglvl=3 option to KDUMP_COMMANDLINE_APPEND
|
||||||
|
#
|
||||||
|
# Logging levels: no logging(0), error(1),warn(2),info(3),debug(4)
|
||||||
|
#
|
||||||
|
# KDUMP_STDLOGLVL=3
|
||||||
|
# KDUMP_SYSLOGLVL=0
|
||||||
|
# KDUMP_KMSGLOGLVL=0
|
||||||
|
|
|
@ -17,7 +17,7 @@ KDUMP_COMMANDLINE=""
|
||||||
# This variable lets us remove arguments from the current kdump commandline
|
# This variable lets us remove arguments from the current kdump commandline
|
||||||
# as taken from either KDUMP_COMMANDLINE above, or from /proc/cmdline
|
# as taken from either KDUMP_COMMANDLINE above, or from /proc/cmdline
|
||||||
# NOTE: some arguments such as crashkernel will always be removed
|
# NOTE: some arguments such as crashkernel will always be removed
|
||||||
KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet"
|
KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet log_buf_len swiotlb prot_virt ignition.firstboot zfcp.allow_lun_scan"
|
||||||
|
|
||||||
# This variable lets us append arguments to the current kdump commandline
|
# This variable lets us append arguments to the current kdump commandline
|
||||||
# after processed by KDUMP_COMMANDLINE_REMOVE
|
# after processed by KDUMP_COMMANDLINE_REMOVE
|
||||||
|
@ -31,7 +31,7 @@ MKDUMPRD_ARGS=""
|
||||||
#
|
#
|
||||||
# Example:
|
# Example:
|
||||||
# KEXEC_ARGS="--elf32-core-headers"
|
# KEXEC_ARGS="--elf32-core-headers"
|
||||||
KEXEC_ARGS=""
|
KEXEC_ARGS="-s"
|
||||||
|
|
||||||
#Where to find the boot image
|
#Where to find the boot image
|
||||||
#KDUMP_BOOTDIR="/boot"
|
#KDUMP_BOOTDIR="/boot"
|
||||||
|
@ -41,3 +41,19 @@ KDUMP_IMG="vmlinuz"
|
||||||
|
|
||||||
#What is the images extension. Relocatable kernels don't have one
|
#What is the images extension. Relocatable kernels don't have one
|
||||||
KDUMP_IMG_EXT=""
|
KDUMP_IMG_EXT=""
|
||||||
|
|
||||||
|
# Logging is controlled by following 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)
|
||||||
|
#
|
||||||
|
# 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: add the rd.kdumploglvl=3 option to KDUMP_COMMANDLINE_APPEND
|
||||||
|
#
|
||||||
|
# Logging levels: no logging(0), error(1),warn(2),info(3),debug(4)
|
||||||
|
#
|
||||||
|
# KDUMP_STDLOGLVL=3
|
||||||
|
# KDUMP_SYSLOGLVL=0
|
||||||
|
# KDUMP_KMSGLOGLVL=0
|
||||||
|
|
|
@ -17,18 +17,18 @@ KDUMP_COMMANDLINE=""
|
||||||
# This variable lets us remove arguments from the current kdump commandline
|
# This variable lets us remove arguments from the current kdump commandline
|
||||||
# as taken from either KDUMP_COMMANDLINE above, or from /proc/cmdline
|
# as taken from either KDUMP_COMMANDLINE above, or from /proc/cmdline
|
||||||
# NOTE: some arguments such as crashkernel will always be removed
|
# NOTE: some arguments such as crashkernel will always be removed
|
||||||
KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet"
|
KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet log_buf_len swiotlb ignition.firstboot"
|
||||||
|
|
||||||
# This variable lets us append arguments to the current kdump commandline
|
# This variable lets us append arguments to the current kdump commandline
|
||||||
# after processed by KDUMP_COMMANDLINE_REMOVE
|
# 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 rootflags=nofail acpi_no_memhotplug transparent_hugepage=never nokaslr novmcoredd"
|
KDUMP_COMMANDLINE_APPEND="irqpoll nr_cpus=1 reset_devices cgroup_disable=memory mce=off numa=off udev.children-max=2 panic=10 rootflags=nofail acpi_no_memhotplug transparent_hugepage=never nokaslr novmcoredd hest_disable"
|
||||||
|
|
||||||
# Any additional kexec arguments required. In most situations, this should
|
# Any additional kexec arguments required. In most situations, this should
|
||||||
# be left empty
|
# be left empty
|
||||||
#
|
#
|
||||||
# Example:
|
# Example:
|
||||||
# KEXEC_ARGS="--elf32-core-headers"
|
# KEXEC_ARGS="--elf32-core-headers"
|
||||||
KEXEC_ARGS=""
|
KEXEC_ARGS="-s"
|
||||||
|
|
||||||
#Where to find the boot image
|
#Where to find the boot image
|
||||||
#KDUMP_BOOTDIR="/boot"
|
#KDUMP_BOOTDIR="/boot"
|
||||||
|
@ -38,3 +38,19 @@ KDUMP_IMG="vmlinuz"
|
||||||
|
|
||||||
#What is the images extension. Relocatable kernels don't have one
|
#What is the images extension. Relocatable kernels don't have one
|
||||||
KDUMP_IMG_EXT=""
|
KDUMP_IMG_EXT=""
|
||||||
|
|
||||||
|
# Logging is controlled by following 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)
|
||||||
|
#
|
||||||
|
# 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: add the rd.kdumploglvl=3 option to KDUMP_COMMANDLINE_APPEND
|
||||||
|
#
|
||||||
|
# Logging levels: no logging(0), error(1),warn(2),info(3),debug(4)
|
||||||
|
#
|
||||||
|
# KDUMP_STDLOGLVL=3
|
||||||
|
# KDUMP_SYSLOGLVL=0
|
||||||
|
# KDUMP_KMSGLOGLVL=0
|
||||||
|
|
794
SOURCES/kdumpctl
794
SOURCES/kdumpctl
File diff suppressed because it is too large
Load Diff
|
@ -44,6 +44,11 @@ impossible to use password authentication during kdump.
|
||||||
.TP
|
.TP
|
||||||
.I showmem
|
.I showmem
|
||||||
Prints the size of reserved memory for crash kernel in megabytes.
|
Prints the size of reserved memory for crash kernel in megabytes.
|
||||||
|
.TP
|
||||||
|
.I estimate
|
||||||
|
Estimate a suitable crashkernel value for current machine. This is a
|
||||||
|
best-effort estimate. It will print a recommanded crashkernel value
|
||||||
|
based on current kdump setup, and list some details of memory usage.
|
||||||
|
|
||||||
.SH "SEE ALSO"
|
.SH "SEE ALSO"
|
||||||
.BR kdump.conf (5),
|
.BR kdump.conf (5),
|
||||||
|
|
|
@ -1,15 +1,22 @@
|
||||||
|
=================
|
||||||
Kexec/Kdump HOWTO
|
Kexec/Kdump HOWTO
|
||||||
|
=================
|
||||||
|
|
||||||
|
|
||||||
Introduction
|
Introduction
|
||||||
|
============
|
||||||
|
|
||||||
Kexec and kdump are new features in the 2.6 mainstream kernel. These features
|
Kexec and kdump are new features in the 2.6 mainstream kernel. These features
|
||||||
are included in Red Hat Enterprise Linux 5. The purpose of these features
|
are included in Red Hat Enterprise Linux 5. The purpose of these features
|
||||||
is to ensure faster boot up and creation of reliable kernel vmcores for
|
is to ensure faster boot up and creation of reliable kernel vmcores for
|
||||||
diagnostic purposes.
|
diagnostic purposes.
|
||||||
|
|
||||||
|
|
||||||
Overview
|
Overview
|
||||||
|
========
|
||||||
|
|
||||||
Kexec
|
Kexec
|
||||||
|
-----
|
||||||
|
|
||||||
Kexec is a fastboot mechanism which allows booting a Linux kernel from the
|
Kexec is a fastboot mechanism which allows booting a Linux kernel from the
|
||||||
context of already running kernel without going through BIOS. BIOS can be very
|
context of already running kernel without going through BIOS. BIOS can be very
|
||||||
|
@ -17,6 +24,7 @@ time consuming especially on the big servers with lots of peripherals. This can
|
||||||
save a lot of time for developers who end up booting a machine numerous times.
|
save a lot of time for developers who end up booting a machine numerous times.
|
||||||
|
|
||||||
Kdump
|
Kdump
|
||||||
|
-----
|
||||||
|
|
||||||
Kdump is a new kernel crash dumping mechanism and is very reliable because
|
Kdump is a new kernel crash dumping mechanism and is very reliable because
|
||||||
the crash dump is captured from the context of a freshly booted kernel and
|
the crash dump is captured from the context of a freshly booted kernel and
|
||||||
|
@ -52,7 +60,8 @@ Now reboot your system, taking note that it should bypass the BIOS:
|
||||||
# reboot
|
# reboot
|
||||||
|
|
||||||
|
|
||||||
How to configure kdump:
|
How to configure kdump
|
||||||
|
======================
|
||||||
|
|
||||||
Again, we assume if you're reading this document, you should already have
|
Again, we assume if you're reading this document, you should already have
|
||||||
kexec-tools installed. If not, you install it via the following command:
|
kexec-tools installed. If not, you install it via the following command:
|
||||||
|
@ -136,7 +145,9 @@ perform postmortem analysis:
|
||||||
|
|
||||||
and so on...
|
and so on...
|
||||||
|
|
||||||
Notes:
|
|
||||||
|
Notes on kdump
|
||||||
|
==============
|
||||||
|
|
||||||
When kdump starts, the kdump kernel is loaded together with the kdump
|
When kdump starts, the kdump kernel is loaded together with the kdump
|
||||||
initramfs. To save memory usage and disk space, the kdump initramfs is
|
initramfs. To save memory usage and disk space, the kdump initramfs is
|
||||||
|
@ -152,8 +163,10 @@ recommended to rebuild the initramfs manually with following command:
|
||||||
|
|
||||||
# kdumpctl rebuild
|
# kdumpctl rebuild
|
||||||
|
|
||||||
|
|
||||||
Saving vmcore-dmesg.txt
|
Saving vmcore-dmesg.txt
|
||||||
----------------------
|
=======================
|
||||||
|
|
||||||
Kernel log bufferes are one of the most important information available
|
Kernel log bufferes are one of the most important information available
|
||||||
in vmcore. Now before saving vmcore, kernel log bufferes are extracted
|
in vmcore. Now before saving vmcore, kernel log bufferes are extracted
|
||||||
from /proc/vmcore and saved into a file vmcore-dmesg.txt. After
|
from /proc/vmcore and saved into a file vmcore-dmesg.txt. After
|
||||||
|
@ -161,7 +174,9 @@ vmcore-dmesg.txt, vmcore is saved. Destination disk and directory for
|
||||||
vmcore-dmesg.txt is same as vmcore. Note that kernel log buffers will
|
vmcore-dmesg.txt is same as vmcore. Note that kernel log buffers will
|
||||||
not be available if dump target is raw device.
|
not be available if dump target is raw device.
|
||||||
|
|
||||||
Dump Triggering methods:
|
|
||||||
|
Dump Triggering methods
|
||||||
|
=======================
|
||||||
|
|
||||||
This section talks about the various ways, other than a Kernel Panic, in which
|
This section talks about the various ways, other than a Kernel Panic, in which
|
||||||
Kdump can be triggered. The following methods assume that Kdump is configured
|
Kdump can be triggered. The following methods assume that Kdump is configured
|
||||||
|
@ -268,7 +283,8 @@ to initate the dump and then click "Restart blade with NMI". This issues a
|
||||||
system reset and invokes xmon debugger.
|
system reset and invokes xmon debugger.
|
||||||
|
|
||||||
|
|
||||||
Advanced Setups:
|
Dump targets
|
||||||
|
============
|
||||||
|
|
||||||
In addition to being able to capture a vmcore to your system's local file
|
In addition to being able to capture a vmcore to your system's local file
|
||||||
system, kdump can be configured to capture a vmcore to a number of other
|
system, kdump can be configured to capture a vmcore to a number of other
|
||||||
|
@ -276,7 +292,8 @@ locations, including a raw disk partition, a dedicated file system, an NFS
|
||||||
mounted file system, or a remote system via ssh/scp. Additional options
|
mounted file system, or a remote system via ssh/scp. Additional options
|
||||||
exist for specifying the relative path under which the dump is captured,
|
exist for specifying the relative path under which the dump is captured,
|
||||||
what to do if the capture fails, and for compressing and filtering the dump
|
what to do if the capture fails, and for compressing and filtering the dump
|
||||||
(so as to produce smaller, more manageable, vmcore files).
|
(so as to produce smaller, more manageable, vmcore files, see "Advanced Setups"
|
||||||
|
for more detail on these options).
|
||||||
|
|
||||||
In theory, dumping to a location other than the local file system should be
|
In theory, dumping to a location other than the local file system should be
|
||||||
safer than kdump's default setup, as its possible the default setup will try
|
safer than kdump's default setup, as its possible the default setup will try
|
||||||
|
@ -289,32 +306,133 @@ as allowing for the centralization of vmcore files, should you have several
|
||||||
systems from which you'd like to obtain vmcore files. Of course, note that
|
systems from which you'd like to obtain vmcore files. Of course, note that
|
||||||
these configurations could present problems if your network is unreliable.
|
these configurations could present problems if your network is unreliable.
|
||||||
|
|
||||||
Advanced setups are configured via modifications to /etc/kdump.conf,
|
Kdump target and advanced setups are configured via modifications to
|
||||||
which out of the box, is fairly well documented itself. Any alterations to
|
/etc/kdump.conf, which out of the box, is fairly well documented itself.
|
||||||
/etc/kdump.conf should be followed by a restart of the kdump service, so
|
Any alterations to /etc/kdump.conf should be followed by a restart of the
|
||||||
the changes can be incorporated in the kdump initrd. Restarting the kdump
|
kdump service, so the changes can be incorporated in the kdump initrd.
|
||||||
service is as simple as '/sbin/systemctl restart kdump.service'.
|
Restarting the kdump service is as simple as '/sbin/systemctl restart kdump.service'.
|
||||||
|
|
||||||
|
There are two ways to config the dump target, config dump target only
|
||||||
|
using "path", and config dump target explicitly. Interpretation of "path"
|
||||||
|
also differs in two config styles.
|
||||||
|
|
||||||
Note that kdump.conf is used as a configuration mechanism for capturing dump
|
Config dump target only using "path"
|
||||||
files from the initramfs (in the interests of safety), the root file system is
|
------------------------------------
|
||||||
mounted, and the init process is started, only as a last resort if the
|
|
||||||
initramfs fails to capture the vmcore. As such, configuration made in
|
You can change the dump target by setting "path" to a mount point where
|
||||||
/etc/kdump.conf is only applicable to capture recorded in the initramfs. If
|
dump target is mounted. When there is no explicitly configured dump target,
|
||||||
for any reason the init process is started on the root file system, only a
|
"path" in kdump.conf represents the current file system path in which vmcore
|
||||||
simple copying of the vmcore from /proc/vmcore to /var/crash/$DATE/vmcore will
|
will be saved. Kdump will automatically detect the underlying device of
|
||||||
be preformed.
|
"path" and use that as the dump target.
|
||||||
|
|
||||||
|
In fact, upon dump, kdump creates a directory $hostip-$date with-in "path"
|
||||||
|
and saves vmcore there. So practically dump is saved in $path/$hostip-$date/.
|
||||||
|
|
||||||
|
Kdump will only check current mount status for mount entry corresponding to
|
||||||
|
"path". So please ensure the dump target is mounted on "path" before kdump
|
||||||
|
service starts.
|
||||||
|
|
||||||
|
NOTES:
|
||||||
|
|
||||||
|
- It's strongly recommanded to put an mount entry for "path" in /etc/fstab
|
||||||
|
and have it auto mounted on boot. This make sure the dump target is
|
||||||
|
reachable from the machine and kdump's configuration is stable.
|
||||||
|
|
||||||
|
EXAMPLES:
|
||||||
|
|
||||||
|
- path /var/crash/
|
||||||
|
|
||||||
|
This is the default configuration. Assuming there is no disk mounted
|
||||||
|
on /var/ or on /var/crash, dump will be saved on disk backing rootfs
|
||||||
|
in directory /var/crash.
|
||||||
|
|
||||||
|
- path /var/crash/ (A separate disk mounted on /var/crash)
|
||||||
|
|
||||||
|
Say a disk /dev/sdb is mounted on /var. In this case dump target will
|
||||||
|
become /dev/sdb and path will become "/" and dump will be saved
|
||||||
|
on "sdb:/var/crash/" directory.
|
||||||
|
|
||||||
|
- path /var/crash/ (NFS mounted on /var)
|
||||||
|
|
||||||
|
Say foo.com:/export/tmp is mounted on /var. In this case dump target is
|
||||||
|
nfs server and path will be adjusted to "/crash" and dump will be saved to
|
||||||
|
foo.com:/export/tmp/crash/ directory.
|
||||||
|
|
||||||
|
Config dump target explicitely
|
||||||
|
------------------------------
|
||||||
|
|
||||||
|
You can set the dump target explicitly in kdump.conf, and "path" will be
|
||||||
|
the relative path in the specified dump target. For example, if dump
|
||||||
|
target is "ext4 /dev/sda", then dump will be saved in "path" directory
|
||||||
|
on /dev/sda.
|
||||||
|
|
||||||
|
Same is the case for nfs dump. If user specified "nfs foo.com:/export/tmp/"
|
||||||
|
as dump target, then dump will effectively be saved in
|
||||||
|
"foo.com:/export/tmp/var/crash/" directory.
|
||||||
|
|
||||||
|
If the dump target is "raw", then "path" is ignored.
|
||||||
|
|
||||||
|
If it's a filesystem target, kdump will need to know the right mount option.
|
||||||
|
Kdump will check current mount status, and then /etc/fstab for mount options
|
||||||
|
corresponding to the specified dump target and use it. If there are
|
||||||
|
special mount option required for the dump target, it could be set by put
|
||||||
|
an entry in fstab.
|
||||||
|
|
||||||
|
If there are no related mount entry, mount option is set to "defaults".
|
||||||
|
|
||||||
|
NOTES:
|
||||||
|
|
||||||
|
- It's recommended to put an entry for the dump target in /etc/fstab
|
||||||
|
and have it auto mounted on boot. This make sure the dump target is
|
||||||
|
reachable from the machine and kdump won't fail.
|
||||||
|
|
||||||
|
- Kdump ignores some mount options, including "noauto", "ro". This
|
||||||
|
make it possible to keep the dump target unmounted or read-only
|
||||||
|
when not used.
|
||||||
|
|
||||||
|
EXAMPLES:
|
||||||
|
|
||||||
|
- ext4 /dev/sda (mounted)
|
||||||
|
path /var/crash/
|
||||||
|
|
||||||
|
In this case dump target is set to /dev/sdb, path is the absolute path
|
||||||
|
"/var/crash" in /dev/sda, vmcore path will saved on
|
||||||
|
"sda:/var/crash" directory.
|
||||||
|
|
||||||
|
- nfs foo.com:/export/tmp (mounted)
|
||||||
|
path /var/crash/
|
||||||
|
|
||||||
|
In this case dump target is nfs server, path is the absolute path
|
||||||
|
"/var/crash", vmcore path will saved on "foo.com:/export/tmp/crash/" directory.
|
||||||
|
|
||||||
|
- nfs foo.com:/export/tmp (not mounted)
|
||||||
|
path /var/crash/
|
||||||
|
|
||||||
|
Same with above case, kdump will use "defaults" as the mount option
|
||||||
|
for the dump target.
|
||||||
|
|
||||||
|
- nfs foo.com:/export/tmp (not mounted, entry with option "noauto,nolock" exists in /etc/fstab)
|
||||||
|
path /var/crash/
|
||||||
|
|
||||||
|
In this case dump target is nfs server, vmcore path will saved on
|
||||||
|
"foo.com:/export/tmp/crash/" directory, and kdump will inherit "nolock" option.
|
||||||
|
|
||||||
|
Dump target and mkdumprd
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
MKdumprd is the tool used to create kdump initramfs, and it may change
|
||||||
|
the mount status of the dump target in some condition.
|
||||||
|
|
||||||
For both local filesystem and nfs dump the dump target must be mounted before
|
|
||||||
building kdump initramfs. That means one needs to put an entry for the dump
|
|
||||||
file system in /etc/fstab so that after reboot when kdump service starts,
|
|
||||||
it can find the dump target and build initramfs instead of failing.
|
|
||||||
Usually the dump target should be used only for kdump. If you worry about
|
Usually the dump target should be used only for kdump. If you worry about
|
||||||
someone uses the filesystem for something else other than dumping vmcore
|
someone uses the filesystem for something else other than dumping vmcore
|
||||||
you can mount it as read-only. Mkdumprd will still remount it as read-write
|
you can mount it as read-only or make it a noauto mount. Mkdumprd will
|
||||||
for creating dump directory and will move it back to read-only afterwards.
|
mount/remount it as read-write for creating dump directory and will
|
||||||
|
move it back to it's original state afterwards.
|
||||||
|
|
||||||
Raw partition
|
Supported dump target types and requirements
|
||||||
|
--------------------------------------------
|
||||||
|
|
||||||
|
1) Raw partition
|
||||||
|
|
||||||
Raw partition dumping requires that a disk partition in the system, at least
|
Raw partition dumping requires that a disk partition in the system, at least
|
||||||
as large as the amount of memory in the system, be left unformatted. Assuming
|
as large as the amount of memory in the system, be left unformatted. Assuming
|
||||||
|
@ -325,7 +443,7 @@ onto partition /dev/vg/lv_kdump. Restart the kdump service via
|
||||||
initrd. Dump target should be persistent device name, such as lvm or device
|
initrd. Dump target should be persistent device name, such as lvm or device
|
||||||
mapper canonical name.
|
mapper canonical name.
|
||||||
|
|
||||||
Dedicated file system
|
2) Dedicated file system
|
||||||
|
|
||||||
Similar to raw partition dumping, you can format a partition with the file
|
Similar to raw partition dumping, you can format a partition with the file
|
||||||
system of your choice, Again, it should be at least as large as the amount
|
system of your choice, Again, it should be at least as large as the amount
|
||||||
|
@ -349,7 +467,7 @@ Be careful of your filesystem selection when using this target.
|
||||||
It is recommended to use persistent device names or UUID/LABEL for file system
|
It is recommended to use persistent device names or UUID/LABEL for file system
|
||||||
dumps. One example of persistent device is /dev/vg/<devname>.
|
dumps. One example of persistent device is /dev/vg/<devname>.
|
||||||
|
|
||||||
NFS mount
|
3) NFS mount
|
||||||
|
|
||||||
Dumping over NFS requires an NFS server configured to export a file system
|
Dumping over NFS requires an NFS server configured to export a file system
|
||||||
with full read/write access for the root user. All operations done within
|
with full read/write access for the root user. All operations done within
|
||||||
|
@ -367,7 +485,7 @@ mount the NFS mount and copy out the vmcore to your NFS server. Restart the
|
||||||
kdump service via '/sbin/systemctl restart kdump.service' to commit this change
|
kdump service via '/sbin/systemctl restart kdump.service' to commit this change
|
||||||
to your kdump initrd.
|
to your kdump initrd.
|
||||||
|
|
||||||
Special mount via "dracut_args"
|
4) Special mount via "dracut_args"
|
||||||
|
|
||||||
You can utilize "dracut_args" to pass "--mount" to kdump, see dracut manpage
|
You can utilize "dracut_args" to pass "--mount" to kdump, see dracut manpage
|
||||||
about the format of "--mount" for details. If there is any "--mount" specified
|
about the format of "--mount" for details. If there is any "--mount" specified
|
||||||
|
@ -385,7 +503,7 @@ dracut_args --mount "192.168.1.1:/share /mnt/test nfs4 defaults"
|
||||||
NOTE:
|
NOTE:
|
||||||
- <mountpoint> must be specified as an absolute path.
|
- <mountpoint> must be specified as an absolute path.
|
||||||
|
|
||||||
Remote system via ssh/scp
|
5) Remote system via ssh/scp
|
||||||
|
|
||||||
Dumping over ssh/scp requires setting up passwordless ssh keys for every
|
Dumping over ssh/scp requires setting up passwordless ssh keys for every
|
||||||
machine you wish to have dump via this method. First up, configure kdump.conf
|
machine you wish to have dump via this method. First up, configure kdump.conf
|
||||||
|
@ -403,73 +521,127 @@ you've connected to it, and then input the target system user's password
|
||||||
to send over the necessary ssh key file. Restart the kdump service via
|
to send over the necessary ssh key file. Restart the kdump service via
|
||||||
'/sbin/systemctl restart kdump.service' to commit this change to your kdump initrd.
|
'/sbin/systemctl restart kdump.service' to commit this change to your kdump initrd.
|
||||||
|
|
||||||
Path
|
Advanced Setups
|
||||||
====
|
===============
|
||||||
"path" represents the file system path in which vmcore will be saved. In
|
|
||||||
fact kdump creates a directory $hostip-$date with-in "path" and saves
|
|
||||||
vmcore there. So practically dump is saved in $path/$hostip-$date/. To
|
|
||||||
simplify discussion further, if we say dump will be saved in $path, it
|
|
||||||
is implied that kdump will create another directory inside path and
|
|
||||||
save vmcore there.
|
|
||||||
|
|
||||||
If a dump target is specified in kdump.conf, then "path" is relative to the
|
About /etc/sysconfig/kdump
|
||||||
specified dump target. For example, if dump target is "ext4 /dev/sda", then
|
------------------------------
|
||||||
dump will be saved in "$path" directory on /dev/sda.
|
|
||||||
|
|
||||||
Same is the case for nfs dump. If user specified "nfs foo.com:/export/tmp/"
|
Currently, there are a few options in /etc/sysconfig/kdump, which are
|
||||||
as dump target, then dump will effectively be saved in
|
usually used to control the behavior of kdump kernel. Basically, all of
|
||||||
"foo.com:/export/tmp/var/crash/" directory.
|
these options have default values, usually we do not need to change them,
|
||||||
|
but sometimes, we may modify them in order to better control the behavior
|
||||||
|
of kdump kernel such as debug, etc.
|
||||||
|
|
||||||
Interpretation of path changes a bit if user has not specified a dump
|
-KDUMP_BOOTDIR
|
||||||
target explicitly in kdump.conf. In this case, "path" represents the
|
|
||||||
absolute path from root. And dump target and adjusted path are arrived
|
|
||||||
at automatically depending on what's mounted in the current system.
|
|
||||||
|
|
||||||
Following are few examples.
|
|
||||||
|
|
||||||
path /var/crash/
|
|
||||||
----------------
|
|
||||||
Assuming there is no disk mounted on /var/ or on /var/crash, dump will
|
|
||||||
be saved on disk backing rootfs in directory /var/crash.
|
|
||||||
|
|
||||||
path /var/crash/ (A separate disk mounted on /var)
|
|
||||||
--------------------------------------------------
|
|
||||||
Say a disk /dev/sdb is mouted on /var. In this case dump target will
|
|
||||||
become /dev/sdb and path will become "/crash" and dump will be saved
|
|
||||||
on "sdb:/crash/" directory.
|
|
||||||
|
|
||||||
path /var/crash/ (NFS mounted on /var)
|
|
||||||
-------------------------------------
|
|
||||||
Say foo.com:/export/tmp is mounted on /var. In this case dump target is
|
|
||||||
nfs server and path will be adjusted to "/crash" and dump will be saved to
|
|
||||||
foo.com:/export/tmp/crash/ directory.
|
|
||||||
|
|
||||||
Kdump boot directory
|
|
||||||
====================
|
|
||||||
Usually kdump kernel is the same as 1st kernel. So kdump will try to find
|
Usually kdump kernel is the same as 1st kernel. So kdump will try to find
|
||||||
kdump kernel under /boot according to /proc/cmdline. E.g we execute below
|
kdump kernel under /boot according to /proc/cmdline. E.g we execute below
|
||||||
command and get an output:
|
command and get an output:
|
||||||
cat /proc/cmdline
|
cat /proc/cmdline
|
||||||
BOOT_IMAGE=/xxx/vmlinuz-3.yyy.zzz root=xxxx .....
|
BOOT_IMAGE=/xxx/vmlinuz-3.yyy.zzz root=xxxx .....
|
||||||
Then kdump kernel will be /boot/xxx/vmlinuz-3.yyy.zzz.
|
|
||||||
However a variable KDUMP_BOOTDIR in /etc/sysconfig/kdump is provided to
|
Then kdump kernel will be /boot/xxx/vmlinuz-3.yyy.zzz. However, this option
|
||||||
user if kdump kernel is put in a different directory.
|
is provided to user if kdump kernel is put in a different directory.
|
||||||
|
|
||||||
|
-KDUMP_IMG
|
||||||
|
|
||||||
|
This represents the image type used for kdump. The default value is "vmlinuz".
|
||||||
|
|
||||||
|
-KDUMP_IMG_EXT
|
||||||
|
|
||||||
|
This represents the images extension. Relocatable kernels don't have one.
|
||||||
|
Currently, it is a null string by default.
|
||||||
|
|
||||||
|
-KEXEC_ARGS
|
||||||
|
|
||||||
|
Any additional kexec arguments required. For example:
|
||||||
|
KEXEC_ARGS="--elf32-core-headers".
|
||||||
|
|
||||||
|
In most situations, this should be left empty. But, sometimes we hope to get
|
||||||
|
additional kexec loading debugging information, we can add the '-d' option
|
||||||
|
for the debugging.
|
||||||
|
|
||||||
|
-KDUMP_KERNELVER
|
||||||
|
|
||||||
|
This is a kernel version string for the kdump kernel. If the version is not
|
||||||
|
specified, the init script will try to find a kdump kernel with the same
|
||||||
|
version number as the running kernel.
|
||||||
|
|
||||||
|
-KDUMP_COMMANDLINE
|
||||||
|
|
||||||
|
The value of 'KDUMP_COMMANDLINE' will be passed to kdump kernel as command
|
||||||
|
line parameters, this will likely match the contents of the grub kernel line.
|
||||||
|
|
||||||
|
In general, if a command line is not specified, which means that it is a null
|
||||||
|
string such as KDUMP_COMMANDLINE="", the default will be taken automatically
|
||||||
|
from the '/proc/cmdline'.
|
||||||
|
|
||||||
|
-KDUMP_COMMANDLINE_REMOVE
|
||||||
|
|
||||||
|
This option allows us to remove arguments from the current kdump command line.
|
||||||
|
If we don't specify any parameters for the KDUMP_COMMANDLINE, it will inherit
|
||||||
|
all values from the '/proc/cmdline', which is not expected. As you know, some
|
||||||
|
default kernel parameters could affect kdump, furthermore, that could cause
|
||||||
|
the failure of kdump kernel boot.
|
||||||
|
|
||||||
|
In addition, the option is also helpful to debug the kdump kernel, we can use
|
||||||
|
this option to change kdump kernel command line.
|
||||||
|
|
||||||
|
For more kernel parameters, please refer to kernel document.
|
||||||
|
|
||||||
|
-KDUMP_COMMANDLINE_APPEND
|
||||||
|
|
||||||
|
This option allows us to append arguments to the current kdump command line
|
||||||
|
after processed by the KDUMP_COMMANDLINE_REMOVE. For kdump kernel, some
|
||||||
|
specific modules require to be disabled like the mce, cgroup, numa, hest_disable,
|
||||||
|
etc. Those modules may waste memory or kdump kernel doesn't need them,
|
||||||
|
furthermore, there may affect kdump kernel boot.
|
||||||
|
|
||||||
|
Just like above option, it can be used to disable or enable some kernel
|
||||||
|
modules so that we can exclude any errors for kdump kernel, this is very
|
||||||
|
meaningful for debugging.
|
||||||
|
|
||||||
|
-KDUMP_STDLOGLVL | KDUMP_SYSLOGLVL | KDUMP_KMSGLOGLVL
|
||||||
|
|
||||||
|
These variables are used to control the kdump log level in the first kernel.
|
||||||
|
In the second kernel, kdump will use the rd.kdumploglvl option to set the log
|
||||||
|
level in the above KDUMP_COMMANDLINE_APPEND.
|
||||||
|
|
||||||
|
Logging levels: no logging(0), error(1), warn(2), info(3), debug(4)
|
||||||
|
|
||||||
Kdump Post-Capture Executable
|
Kdump Post-Capture Executable
|
||||||
|
-----------------------------
|
||||||
|
|
||||||
It is possible to specify a custom script or binary you wish to run following
|
It is possible to specify a custom script or binary you wish to run following
|
||||||
an attempt to capture a vmcore. The executable is passed an exit code from
|
an attempt to capture a vmcore. The executable is passed an exit code from
|
||||||
the capture process, which can be used to trigger different actions from
|
the capture process, which can be used to trigger different actions from
|
||||||
within your post-capture executable.
|
within your post-capture executable.
|
||||||
|
If /etc/kdump/post.d directory exist, All files in the directory are
|
||||||
|
collectively sorted and executed in lexical order, before binary or script
|
||||||
|
specified kdump_post parameter is executed.
|
||||||
|
|
||||||
|
In these scripts, the reference to the storage or network device should adhere
|
||||||
|
to the section 'Supported dump target types and requirements'
|
||||||
|
|
||||||
Kdump Pre-Capture Executable
|
Kdump Pre-Capture Executable
|
||||||
|
----------------------------
|
||||||
|
|
||||||
It is possible to specify a custom script or binary you wish to run before
|
It is possible to specify a custom script or binary you wish to run before
|
||||||
capturing a vmcore. Exit status of this binary is interpreted:
|
capturing a vmcore. Exit status of this binary is interpreted:
|
||||||
0 - continue with dump process as usual
|
0 - continue with dump process as usual
|
||||||
non 0 - reboot the system
|
non 0 - run the final action (reboot/poweroff/halt)
|
||||||
|
If /etc/kdump/pre.d directory exists, all files in the directory are collectively
|
||||||
|
sorted and executed in lexical order, after binary or script specified
|
||||||
|
kdump_pre parameter is executed.
|
||||||
|
Even if the binary or script in /etc/kdump/pre.d directory returns non 0
|
||||||
|
exit status, the processing is continued.
|
||||||
|
|
||||||
|
In these scripts, the reference to the storage or network device should adhere
|
||||||
|
to the section 'Supported dump target types and requirements'
|
||||||
|
|
||||||
Extra Binaries
|
Extra Binaries
|
||||||
|
--------------
|
||||||
|
|
||||||
If you have specific binaries or scripts you want to have made available
|
If you have specific binaries or scripts you want to have made available
|
||||||
within your kdump initrd, you can specify them by their full path, and they
|
within your kdump initrd, you can specify them by their full path, and they
|
||||||
|
@ -478,6 +650,7 @@ This may be particularly useful for those running post-capture scripts that
|
||||||
rely on other binaries.
|
rely on other binaries.
|
||||||
|
|
||||||
Extra Modules
|
Extra Modules
|
||||||
|
-------------
|
||||||
|
|
||||||
By default, only the bare minimum of kernel modules will be included in your
|
By default, only the bare minimum of kernel modules will be included in your
|
||||||
kdump initrd. Should you wish to capture your vmcore files to a non-boot-path
|
kdump initrd. Should you wish to capture your vmcore files to a non-boot-path
|
||||||
|
@ -486,7 +659,8 @@ need to manually specify additional kernel modules to load into your kdump
|
||||||
initrd.
|
initrd.
|
||||||
|
|
||||||
Failure action
|
Failure action
|
||||||
==============
|
--------------
|
||||||
|
|
||||||
Failure action specifies what to do when dump to configured dump target
|
Failure action specifies what to do when dump to configured dump target
|
||||||
fails. By default, failure action is "reboot" and that is system reboots
|
fails. By default, failure action is "reboot" and that is system reboots
|
||||||
if attempt to save dump to dump target fails.
|
if attempt to save dump to dump target fails.
|
||||||
|
@ -494,21 +668,24 @@ if attempt to save dump to dump target fails.
|
||||||
There are other failure actions available though.
|
There are other failure actions available though.
|
||||||
|
|
||||||
- dump_to_rootfs
|
- dump_to_rootfs
|
||||||
This option tries to mount root and save dump on root filesystem
|
This option tries to mount root and save dump on root filesystem
|
||||||
in a path specified by "path". This option will generally make
|
in a path specified by "path". This option will generally make
|
||||||
sense when dump target is not root filesystem. For example, if
|
sense when dump target is not root filesystem. For example, if
|
||||||
dump is being saved over network using "ssh" then one can specify
|
dump is being saved over network using "ssh" then one can specify
|
||||||
failure action to "dump_to_rootfs" to try saving dump to root
|
failure action to "dump_to_rootfs" to try saving dump to root
|
||||||
filesystem if dump over network fails.
|
filesystem if dump over network fails.
|
||||||
|
|
||||||
- shell
|
- shell
|
||||||
Drop into a shell session inside initramfs.
|
Drop into a shell session inside initramfs.
|
||||||
|
|
||||||
- halt
|
- halt
|
||||||
Halt system after failure
|
Halt system after failure
|
||||||
|
|
||||||
- poweroff
|
- poweroff
|
||||||
Poweroff system after failure.
|
Poweroff system after failure.
|
||||||
|
|
||||||
Compression and filtering
|
Compression and filtering
|
||||||
|
-------------------------
|
||||||
|
|
||||||
The 'core_collector' parameter in kdump.conf allows you to specify a custom
|
The 'core_collector' parameter in kdump.conf allows you to specify a custom
|
||||||
dump capture method. The most common alternate method is makedumpfile, which
|
dump capture method. The most common alternate method is makedumpfile, which
|
||||||
|
@ -516,7 +693,7 @@ is a dump filtering and compression utility provided with kexec-tools. On
|
||||||
some architectures, it can drastically reduce the size of your vmcore files,
|
some architectures, it can drastically reduce the size of your vmcore files,
|
||||||
which becomes very useful on systems with large amounts of memory.
|
which becomes very useful on systems with large amounts of memory.
|
||||||
|
|
||||||
A typical setup is 'core_collector makedumpfile -F -l --message-level 1 -d 31',
|
A typical setup is 'core_collector makedumpfile -F -l --message-level 7 -d 31',
|
||||||
but check the output of '/sbin/makedumpfile --help' for a list of all available
|
but check the output of '/sbin/makedumpfile --help' for a list of all available
|
||||||
options (-i and -g don't need to be specified, they're automatically taken care
|
options (-i and -g don't need to be specified, they're automatically taken care
|
||||||
of). Note that use of makedumpfile requires that the kernel-debuginfo package
|
of). Note that use of makedumpfile requires that the kernel-debuginfo package
|
||||||
|
@ -526,22 +703,21 @@ Core collector command format depends on dump target type. Typically for
|
||||||
filesystem (local/remote), core_collector should accept two arguments.
|
filesystem (local/remote), core_collector should accept two arguments.
|
||||||
First one is source file and second one is target file. For ex.
|
First one is source file and second one is target file. For ex.
|
||||||
|
|
||||||
ex1.
|
- ex1.
|
||||||
---
|
|
||||||
core_collector "cp --sparse=always"
|
|
||||||
|
|
||||||
Above will effectively be translated to:
|
core_collector "cp --sparse=always"
|
||||||
|
|
||||||
cp --sparse=always /proc/vmcore <dest-path>/vmcore
|
Above will effectively be translated to:
|
||||||
|
|
||||||
ex2.
|
cp --sparse=always /proc/vmcore <dest-path>/vmcore
|
||||||
---
|
|
||||||
core_collector "makedumpfile -l --message-level 1 -d 31"
|
|
||||||
|
|
||||||
Above will effectively be translated to:
|
- ex2.
|
||||||
|
|
||||||
makedumpfile -l --message-level 1 -d 31 /proc/vmcore <dest-path>/vmcore
|
core_collector "makedumpfile -l --message-level 7 -d 31"
|
||||||
|
|
||||||
|
Above will effectively be translated to:
|
||||||
|
|
||||||
|
makedumpfile -l --message-level 7 -d 31 /proc/vmcore <dest-path>/vmcore
|
||||||
|
|
||||||
For dump targets like raw and ssh, in general, core collector should expect
|
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
|
one argument (source file) and should output the processed core on standard
|
||||||
|
@ -549,59 +725,60 @@ output (There is one exception of "scp", discussed later). This standard
|
||||||
output will be saved to destination using appropriate commands.
|
output will be saved to destination using appropriate commands.
|
||||||
|
|
||||||
raw dumps core_collector examples:
|
raw dumps core_collector examples:
|
||||||
---------
|
|
||||||
ex3.
|
|
||||||
---
|
|
||||||
core_collector "cat"
|
|
||||||
|
|
||||||
Above will effectively be translated to.
|
- ex3.
|
||||||
|
|
||||||
cat /proc/vmcore | dd of=<target-device>
|
core_collector "cat"
|
||||||
|
|
||||||
ex4.
|
Above will effectively be translated to.
|
||||||
---
|
|
||||||
core_collector "makedumpfile -F -l --message-level 1 -d 31"
|
|
||||||
|
|
||||||
Above will effectively be translated to.
|
cat /proc/vmcore | dd of=<target-device>
|
||||||
|
|
||||||
makedumpfile -F -l --message-level 1 -d 31 | dd of=<target-device>
|
- ex4.
|
||||||
|
|
||||||
|
core_collector "makedumpfile -F -l --message-level 7 -d 31"
|
||||||
|
|
||||||
|
Above will effectively be translated to.
|
||||||
|
|
||||||
|
makedumpfile -F -l --message-level 7 -d 31 | dd of=<target-device>
|
||||||
|
|
||||||
ssh dumps core_collector examples:
|
ssh dumps core_collector examples:
|
||||||
---------
|
|
||||||
ex5.
|
|
||||||
---
|
|
||||||
core_collector "cat"
|
|
||||||
|
|
||||||
Above will effectively be translated to.
|
- ex5.
|
||||||
|
|
||||||
cat /proc/vmcore | ssh <options> <remote-location> "dd of=path/vmcore"
|
core_collector "cat"
|
||||||
|
|
||||||
ex6.
|
Above will effectively be translated to.
|
||||||
---
|
|
||||||
core_collector "makedumpfile -F -l --message-level 1 -d 31"
|
|
||||||
|
|
||||||
Above will effectively be translated to.
|
cat /proc/vmcore | ssh <options> <remote-location> "dd of=path/vmcore"
|
||||||
|
|
||||||
makedumpfile -F -l --message-level 1 -d 31 | ssh <options> <remote-location> "dd of=path/vmcore"
|
- ex6.
|
||||||
|
|
||||||
|
core_collector "makedumpfile -F -l --message-level 7 -d 31"
|
||||||
|
|
||||||
|
Above will effectively be translated to.
|
||||||
|
|
||||||
|
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
|
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
|
scp. As scp can handle ssh destinations for file transfers, one can
|
||||||
specify "scp" as core collector for ssh targets (no output on stdout).
|
specify "scp" as core collector for ssh targets (no output on stdout).
|
||||||
|
|
||||||
ex7.
|
- ex7.
|
||||||
----
|
|
||||||
core_collector "scp"
|
|
||||||
|
|
||||||
Above will effectively be translated to.
|
core_collector "scp"
|
||||||
|
|
||||||
scp /proc/vmcore <user@host>:path/vmcore
|
Above will effectively be translated to.
|
||||||
|
|
||||||
|
scp /proc/vmcore <user@host>:path/vmcore
|
||||||
|
|
||||||
About default core collector
|
About default core collector
|
||||||
----------------------------
|
----------------------------
|
||||||
|
|
||||||
Default core_collector for ssh/raw dump is:
|
Default core_collector for ssh/raw dump is:
|
||||||
"makedumpfile -F -l --message-level 1 -d 31".
|
"makedumpfile -F -l --message-level 7 -d 31".
|
||||||
Default core_collector for other targets is:
|
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
|
Even if core_collector option is commented out in kdump.conf, makedumpfile
|
||||||
is default core collector and kdump uses it internally.
|
is default core collector and kdump uses it internally.
|
||||||
|
@ -615,7 +792,9 @@ dump data from stdard input to a normal dumpfile (readable with analysis
|
||||||
tools).
|
tools).
|
||||||
For example: "makedumpfile -R vmcore < vmcore.flat"
|
For example: "makedumpfile -R vmcore < vmcore.flat"
|
||||||
|
|
||||||
Caveats:
|
|
||||||
|
Caveats
|
||||||
|
=======
|
||||||
|
|
||||||
Console frame-buffers and X are not properly supported. If you typically run
|
Console frame-buffers and X are not properly supported. If you typically run
|
||||||
with something along the lines of "vga=791" in your kernel config line or
|
with something along the lines of "vga=791" in your kernel config line or
|
||||||
|
@ -624,7 +803,11 @@ kexec. Note that the kdump kernel should still be able to create a dump,
|
||||||
and when the system reboots, video should be restored to normal.
|
and when the system reboots, video should be restored to normal.
|
||||||
|
|
||||||
|
|
||||||
|
Notes
|
||||||
|
=====
|
||||||
|
|
||||||
Notes on resetting video:
|
Notes on resetting video:
|
||||||
|
-------------------------
|
||||||
|
|
||||||
Video is a notoriously difficult issue with kexec. Video cards contain ROM code
|
Video is a notoriously difficult issue with kexec. Video cards contain ROM code
|
||||||
that controls their initial configuration and setup. This code is nominally
|
that controls their initial configuration and setup. This code is nominally
|
||||||
|
@ -646,7 +829,9 @@ Secondly, it may be worth trying to add vga15fb.ko to the extra_modules list in
|
||||||
/etc/kdump.conf. This will attempt to use the video card in framebuffer mode,
|
/etc/kdump.conf. This will attempt to use the video card in framebuffer mode,
|
||||||
which can blank the screen prior to the start of a dump capture.
|
which can blank the screen prior to the start of a dump capture.
|
||||||
|
|
||||||
Notes on rootfs mount:
|
Notes on rootfs mount
|
||||||
|
---------------------
|
||||||
|
|
||||||
Dracut is designed to mount rootfs by default. If rootfs mounting fails it
|
Dracut is designed to mount rootfs by default. If rootfs mounting fails it
|
||||||
will refuse to go on. So kdump leaves rootfs mounting to dracut currently.
|
will refuse to go on. So kdump leaves rootfs mounting to dracut currently.
|
||||||
We make the assumtion that proper root= cmdline is being passed to dracut
|
We make the assumtion that proper root= cmdline is being passed to dracut
|
||||||
|
@ -656,7 +841,8 @@ options are copied from /proc/cmdline. In general it is best to append
|
||||||
command line options using "KDUMP_COMMANDLINE_APPEND=" instead of replacing
|
command line options using "KDUMP_COMMANDLINE_APPEND=" instead of replacing
|
||||||
the original command line completely.
|
the original command line completely.
|
||||||
|
|
||||||
Notes on watchdog module handling:
|
Notes on watchdog module handling
|
||||||
|
---------------------------------
|
||||||
|
|
||||||
If a watchdog is active in first kernel then, we must have it's module
|
If a watchdog is active in first kernel then, we must have it's module
|
||||||
loaded in crash kernel, so that either watchdog is deactivated or started
|
loaded in crash kernel, so that either watchdog is deactivated or started
|
||||||
|
@ -670,7 +856,8 @@ not been written in watchdog-core framework then this option will not have
|
||||||
any effect and module will not be added. Please note that only systemd
|
any effect and module will not be added. Please note that only systemd
|
||||||
watchdog daemon is supported as watchdog kick application.
|
watchdog daemon is supported as watchdog kick application.
|
||||||
|
|
||||||
Notes for disk images:
|
Notes for disk images
|
||||||
|
---------------------
|
||||||
|
|
||||||
Kdump initramfs is a critical component for capturing the crash dump.
|
Kdump initramfs is a critical component for capturing the crash dump.
|
||||||
But it's strictly generated for the machine it will run on, and have
|
But it's strictly generated for the machine it will run on, and have
|
||||||
|
@ -684,7 +871,8 @@ a machine with a disk image which have kdump initramfs embedded, you
|
||||||
should rebuild the initramfs using "kdumpctl rebuild" command manually,
|
should rebuild the initramfs using "kdumpctl rebuild" command manually,
|
||||||
or else kdump may not work as expeceted.
|
or else kdump may not work as expeceted.
|
||||||
|
|
||||||
Notes on encrypted dump target:
|
Notes on encrypted dump target
|
||||||
|
------------------------------
|
||||||
|
|
||||||
Currently, kdump is not working well with encrypted dump target.
|
Currently, kdump is not working well with encrypted dump target.
|
||||||
First, user have to give the password manually in capture kernel,
|
First, user have to give the password manually in capture kernel,
|
||||||
|
@ -698,7 +886,8 @@ crash kernel according, or update your encryption setup.
|
||||||
It's recommanded to use a non-encrypted target (eg. remote target)
|
It's recommanded to use a non-encrypted target (eg. remote target)
|
||||||
instead.
|
instead.
|
||||||
|
|
||||||
Notes on device dump:
|
Notes on device dump
|
||||||
|
--------------------
|
||||||
|
|
||||||
Device dump allows drivers to append dump data to vmcore, so you can
|
Device dump allows drivers to append dump data to vmcore, so you can
|
||||||
collect driver specified debug info. The drivers could append the
|
collect driver specified debug info. The drivers could append the
|
||||||
|
@ -715,8 +904,10 @@ the dump target setup will be included. To ensure the device dump data
|
||||||
will be included in the vmcore, you need to force include related
|
will be included in the vmcore, you need to force include related
|
||||||
device drivers by using "extra_modules" option in /etc/kdump.conf
|
device drivers by using "extra_modules" option in /etc/kdump.conf
|
||||||
|
|
||||||
|
|
||||||
Parallel Dumping Operation
|
Parallel Dumping Operation
|
||||||
==========================
|
==========================
|
||||||
|
|
||||||
Kexec allows kdump using multiple cpus. So parallel feature can accelerate
|
Kexec allows kdump using multiple cpus. So parallel feature can accelerate
|
||||||
dumping substantially, especially in executing compression and filter.
|
dumping substantially, especially in executing compression and filter.
|
||||||
For example:
|
For example:
|
||||||
|
@ -746,8 +937,10 @@ may lead to panic due to Out Of Memory.
|
||||||
hang, system reset or power-off at boot, depending on your system and runtime
|
hang, system reset or power-off at boot, depending on your system and runtime
|
||||||
situation at the time of crash.
|
situation at the time of crash.
|
||||||
|
|
||||||
|
|
||||||
Debugging Tips
|
Debugging Tips
|
||||||
--------------
|
==============
|
||||||
|
|
||||||
- One can drop into a shell before/after saving vmcore with the help of
|
- One can drop into a shell before/after saving vmcore with the help of
|
||||||
using kdump_pre/kdump_post hooks. Use following in one of the pre/post
|
using kdump_pre/kdump_post hooks. Use following in one of the pre/post
|
||||||
scripts to drop into a shell.
|
scripts to drop into a shell.
|
||||||
|
@ -773,4 +966,82 @@ Debugging Tips
|
||||||
|
|
||||||
Now minicom should be logging serial console in file console-logs.
|
Now minicom should be logging serial console in file console-logs.
|
||||||
|
|
||||||
|
- Using the logger to output kdump log messages
|
||||||
|
|
||||||
|
You can configure the kdump log level for the first kernel in the
|
||||||
|
/etc/sysconfig/kdump. For example:
|
||||||
|
|
||||||
|
KDUMP_STDLOGLVL=3
|
||||||
|
KDUMP_SYSLOGLVL=0
|
||||||
|
KDUMP_KMSGLOGLVL=0
|
||||||
|
|
||||||
|
The above configurations indicate that kdump messages will be printed
|
||||||
|
to the console, and the KDUMP_STDLOGLVL is set to 3(info), but the
|
||||||
|
KDUMP_SYSLOGLVL and KDUMP_KMSGLOGLVL are 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.
|
||||||
|
|
|
@ -1,149 +0,0 @@
|
||||||
From 0f9ee000904ffd1e171ba1f000a83e5ce3717e45 Mon Sep 17 00:00:00 2001
|
|
||||||
From: David Hildenbrand <david@redhat.com>
|
|
||||||
Date: Thu, 22 Nov 2018 11:09:38 +0100
|
|
||||||
Subject: [PATCH] [PATCH] exclude pages that are logically offline
|
|
||||||
|
|
||||||
Linux marks pages that are logically offline via a page flag (map count).
|
|
||||||
Such pages e.g. include pages infated as part of a balloon driver or
|
|
||||||
pages that were not actually onlined when onlining the whole section.
|
|
||||||
|
|
||||||
While the hypervisor usually allows to read such inflated memory, we
|
|
||||||
basically read and dump data that is completely irrelevant. Also, this
|
|
||||||
might result in quite some overhead in the hypervisor. In addition,
|
|
||||||
we saw some problems under Hyper-V, whereby we can crash the kernel by
|
|
||||||
dumping, when reading memory of a partially onlined memory segment
|
|
||||||
(for memory added by the Hyper-V balloon driver).
|
|
||||||
|
|
||||||
Therefore, don't read and dump pages that are marked as being logically
|
|
||||||
offline.
|
|
||||||
|
|
||||||
Signed-off-by: David Hildenbrand <david@redhat.com>
|
|
||||||
Signed-off-by: Pingfan Liu <piliu@redhat.com>
|
|
||||||
---
|
|
||||||
makedumpfile.c | 34 ++++++++++++++++++++++++++++++----
|
|
||||||
makedumpfile.h | 1 +
|
|
||||||
2 files changed, 31 insertions(+), 4 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/makedumpfile.c b/makedumpfile.c
|
|
||||||
index 8923538..a5f2ea9 100644
|
|
||||||
--- a/makedumpfile-1.6.5/makedumpfile.c
|
|
||||||
+++ b/makedumpfile-1.6.5/makedumpfile.c
|
|
||||||
@@ -88,6 +88,7 @@ mdf_pfn_t pfn_cache_private;
|
|
||||||
mdf_pfn_t pfn_user;
|
|
||||||
mdf_pfn_t pfn_free;
|
|
||||||
mdf_pfn_t pfn_hwpoison;
|
|
||||||
+mdf_pfn_t pfn_offline;
|
|
||||||
|
|
||||||
mdf_pfn_t num_dumped;
|
|
||||||
|
|
||||||
@@ -250,6 +251,21 @@ isHugetlb(unsigned long dtor)
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
+isOffline(unsigned long flags, unsigned int _mapcount)
|
|
||||||
+{
|
|
||||||
+ if (NUMBER(PAGE_OFFLINE_MAPCOUNT_VALUE) == NOT_FOUND_NUMBER)
|
|
||||||
+ return FALSE;
|
|
||||||
+
|
|
||||||
+ if (flags & (1UL << NUMBER(PG_slab)))
|
|
||||||
+ return FALSE;
|
|
||||||
+
|
|
||||||
+ if (_mapcount == (int)NUMBER(PAGE_OFFLINE_MAPCOUNT_VALUE))
|
|
||||||
+ return TRUE;
|
|
||||||
+
|
|
||||||
+ return FALSE;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int
|
|
||||||
is_cache_page(unsigned long flags)
|
|
||||||
{
|
|
||||||
if (isLRU(flags))
|
|
||||||
@@ -2287,6 +2303,8 @@ write_vmcoreinfo_data(void)
|
|
||||||
WRITE_NUMBER("PG_hwpoison", PG_hwpoison);
|
|
||||||
|
|
||||||
WRITE_NUMBER("PAGE_BUDDY_MAPCOUNT_VALUE", PAGE_BUDDY_MAPCOUNT_VALUE);
|
|
||||||
+ WRITE_NUMBER("PAGE_OFFLINE_MAPCOUNT_VALUE",
|
|
||||||
+ PAGE_OFFLINE_MAPCOUNT_VALUE);
|
|
||||||
WRITE_NUMBER("phys_base", phys_base);
|
|
||||||
|
|
||||||
WRITE_NUMBER("HUGETLB_PAGE_DTOR", HUGETLB_PAGE_DTOR);
|
|
||||||
@@ -2687,6 +2705,7 @@ read_vmcoreinfo(void)
|
|
||||||
READ_SRCFILE("pud_t", pud_t);
|
|
||||||
|
|
||||||
READ_NUMBER("PAGE_BUDDY_MAPCOUNT_VALUE", PAGE_BUDDY_MAPCOUNT_VALUE);
|
|
||||||
+ READ_NUMBER("PAGE_OFFLINE_MAPCOUNT_VALUE", PAGE_OFFLINE_MAPCOUNT_VALUE);
|
|
||||||
READ_NUMBER("phys_base", phys_base);
|
|
||||||
#ifdef __aarch64__
|
|
||||||
READ_NUMBER("VA_BITS", VA_BITS);
|
|
||||||
@@ -6042,6 +6061,12 @@ __exclude_unnecessary_pages(unsigned long mem_map,
|
|
||||||
pfn_counter = &pfn_hwpoison;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
+ * Exclude pages that are logically offline.
|
|
||||||
+ */
|
|
||||||
+ else if (isOffline(flags, _mapcount)) {
|
|
||||||
+ pfn_counter = &pfn_offline;
|
|
||||||
+ }
|
|
||||||
+ /*
|
|
||||||
* Unexcludable page
|
|
||||||
*/
|
|
||||||
else
|
|
||||||
@@ -7522,7 +7547,7 @@ write_elf_pages_cyclic(struct cache_data *cd_header, struct cache_data *cd_page)
|
|
||||||
*/
|
|
||||||
if (info->flag_cyclic) {
|
|
||||||
pfn_zero = pfn_cache = pfn_cache_private = 0;
|
|
||||||
- pfn_user = pfn_free = pfn_hwpoison = 0;
|
|
||||||
+ pfn_user = pfn_free = pfn_hwpoison = pfn_offline = 0;
|
|
||||||
pfn_memhole = info->max_mapnr;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -8804,7 +8829,7 @@ write_kdump_pages_and_bitmap_cyclic(struct cache_data *cd_header, struct cache_d
|
|
||||||
* Reset counter for debug message.
|
|
||||||
*/
|
|
||||||
pfn_zero = pfn_cache = pfn_cache_private = 0;
|
|
||||||
- pfn_user = pfn_free = pfn_hwpoison = 0;
|
|
||||||
+ pfn_user = pfn_free = pfn_hwpoison = pfn_offline = 0;
|
|
||||||
pfn_memhole = info->max_mapnr;
|
|
||||||
|
|
||||||
/*
|
|
||||||
@@ -9749,7 +9774,7 @@ print_report(void)
|
|
||||||
pfn_original = info->max_mapnr - pfn_memhole;
|
|
||||||
|
|
||||||
pfn_excluded = pfn_zero + pfn_cache + pfn_cache_private
|
|
||||||
- + pfn_user + pfn_free + pfn_hwpoison;
|
|
||||||
+ + pfn_user + pfn_free + pfn_hwpoison + pfn_offline;
|
|
||||||
shrinking = (pfn_original - pfn_excluded) * 100;
|
|
||||||
shrinking = shrinking / pfn_original;
|
|
||||||
|
|
||||||
@@ -9763,6 +9788,7 @@ print_report(void)
|
|
||||||
REPORT_MSG(" User process data pages : 0x%016llx\n", pfn_user);
|
|
||||||
REPORT_MSG(" Free pages : 0x%016llx\n", pfn_free);
|
|
||||||
REPORT_MSG(" Hwpoison pages : 0x%016llx\n", pfn_hwpoison);
|
|
||||||
+ REPORT_MSG(" Offline pages : 0x%016llx\n", pfn_offline);
|
|
||||||
REPORT_MSG(" Remaining pages : 0x%016llx\n",
|
|
||||||
pfn_original - pfn_excluded);
|
|
||||||
REPORT_MSG(" (The number of pages is reduced to %lld%%.)\n",
|
|
||||||
@@ -9790,7 +9816,7 @@ print_mem_usage(void)
|
|
||||||
pfn_original = info->max_mapnr - pfn_memhole;
|
|
||||||
|
|
||||||
pfn_excluded = pfn_zero + pfn_cache + pfn_cache_private
|
|
||||||
- + pfn_user + pfn_free + pfn_hwpoison;
|
|
||||||
+ + pfn_user + pfn_free + pfn_hwpoison + pfn_offline;
|
|
||||||
shrinking = (pfn_original - pfn_excluded) * 100;
|
|
||||||
shrinking = shrinking / pfn_original;
|
|
||||||
total_size = info->page_size * pfn_original;
|
|
||||||
diff --git a/makedumpfile.h b/makedumpfile.h
|
|
||||||
index 73813ed..04c903f 100644
|
|
||||||
--- a/makedumpfile-1.6.5/makedumpfile.h
|
|
||||||
+++ b/makedumpfile-1.6.5/makedumpfile.h
|
|
||||||
@@ -1927,6 +1927,7 @@ struct number_table {
|
|
||||||
long PG_hwpoison;
|
|
||||||
|
|
||||||
long PAGE_BUDDY_MAPCOUNT_VALUE;
|
|
||||||
+ long PAGE_OFFLINE_MAPCOUNT_VALUE;
|
|
||||||
long SECTION_SIZE_BITS;
|
|
||||||
long MAX_PHYSMEM_BITS;
|
|
||||||
long HUGETLB_PAGE_DTOR;
|
|
||||||
--
|
|
||||||
2.7.4
|
|
||||||
|
|
|
@ -1,41 +0,0 @@
|
||||||
From 2f007b48c581a81d7e95678b6bcb77cfbe177135 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Kairui Song <kasong@redhat.com>
|
|
||||||
Date: Tue, 29 Jan 2019 11:14:15 +0800
|
|
||||||
Subject: [PATCH] [PATCH v2] honor the CFLAGS from environment variables
|
|
||||||
|
|
||||||
This makes it possible to pass in extra cflags, for example, hardening
|
|
||||||
flags could be passed in with environment variable when building a
|
|
||||||
hardened package.
|
|
||||||
|
|
||||||
Also introduce a CFLAGS_BASE to hold common CFLAGS, which simplify the
|
|
||||||
CFLAGS definition.
|
|
||||||
|
|
||||||
Suggested-by: Kazuhito Hagio <k-hagio@ab.jp.nec.com>
|
|
||||||
Signed-off-by: Kairui Song <kasong@redhat.com>
|
|
||||||
---
|
|
||||||
Makefile | 9 ++++-----
|
|
||||||
1 file changed, 4 insertions(+), 5 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/Makefile b/Makefile
|
|
||||||
index ea3c47d..bd681d2 100644
|
|
||||||
--- a/makedumpfile-1.6.5/Makefile
|
|
||||||
+++ b/makedumpfile-1.6.5/Makefile
|
|
||||||
@@ -8,11 +8,10 @@ ifeq ($(strip $CC),)
|
|
||||||
CC = gcc
|
|
||||||
endif
|
|
||||||
|
|
||||||
-CFLAGS = -g -O2 -Wall -D_FILE_OFFSET_BITS=64 \
|
|
||||||
- -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE \
|
|
||||||
- -DVERSION='"$(VERSION)"' -DRELEASE_DATE='"$(DATE)"'
|
|
||||||
-CFLAGS_ARCH = -g -O2 -Wall -D_FILE_OFFSET_BITS=64 \
|
|
||||||
- -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
|
|
||||||
+CFLAGS_BASE := $(CFLAGS) -g -O2 -Wall -D_FILE_OFFSET_BITS=64 \
|
|
||||||
+ -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
|
|
||||||
+CFLAGS := $(CFLAGS_BASE) -DVERSION='"$(VERSION)"' -DRELEASE_DATE='"$(DATE)"'
|
|
||||||
+CFLAGS_ARCH := $(CFLAGS_BASE)
|
|
||||||
# LDFLAGS = -L/usr/local/lib -I/usr/local/include
|
|
||||||
|
|
||||||
HOST_ARCH := $(shell uname -m)
|
|
||||||
--
|
|
||||||
2.20.1
|
|
||||||
|
|
|
@ -1,198 +0,0 @@
|
||||||
From d222b01e516bba73ef9fefee4146734a5f260fa1 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Lianbo Jiang <lijiang@redhat.com>
|
|
||||||
Date: Wed, 30 Jan 2019 10:48:53 +0800
|
|
||||||
Subject: [PATCH] [PATCH] x86_64: Add support for AMD Secure Memory Encryption
|
|
||||||
|
|
||||||
On AMD machine with Secure Memory Encryption (SME) feature, if SME is
|
|
||||||
enabled, page tables contain a specific attribute bit (C-bit) in their
|
|
||||||
entries to indicate whether a page is encrypted or unencrypted.
|
|
||||||
|
|
||||||
So get NUMBER(sme_mask) from vmcoreinfo, which stores the value of
|
|
||||||
the C-bit position, and drop it to obtain the true physical address.
|
|
||||||
|
|
||||||
Signed-off-by: Lianbo Jiang <lijiang@redhat.com>
|
|
||||||
---
|
|
||||||
arch/x86_64.c | 30 +++++++++++++++++++-----------
|
|
||||||
makedumpfile.c | 4 ++++
|
|
||||||
makedumpfile.h | 1 +
|
|
||||||
3 files changed, 24 insertions(+), 11 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/arch/x86_64.c b/arch/x86_64.c
|
|
||||||
index 9db1f8139f28..46e93366f0be 100644
|
|
||||||
--- a/makedumpfile-1.6.5/arch/x86_64.c
|
|
||||||
+++ b/makedumpfile-1.6.5/arch/x86_64.c
|
|
||||||
@@ -297,6 +297,7 @@ __vtop4_x86_64(unsigned long vaddr, unsigned long pagetable)
|
|
||||||
unsigned long page_dir, pgd, pud_paddr, pud_pte, pmd_paddr, pmd_pte;
|
|
||||||
unsigned long pte_paddr, pte;
|
|
||||||
unsigned long p4d_paddr, p4d_pte;
|
|
||||||
+ unsigned long entry_mask = ENTRY_MASK;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get PGD.
|
|
||||||
@@ -308,6 +309,9 @@ __vtop4_x86_64(unsigned long vaddr, unsigned long pagetable)
|
|
||||||
return NOT_PADDR;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ if (NUMBER(sme_mask) != NOT_FOUND_NUMBER)
|
|
||||||
+ entry_mask &= ~(NUMBER(sme_mask));
|
|
||||||
+
|
|
||||||
if (check_5level_paging()) {
|
|
||||||
page_dir += pgd5_index(vaddr) * sizeof(unsigned long);
|
|
||||||
if (!readmem(PADDR, page_dir, &pgd, sizeof pgd)) {
|
|
||||||
@@ -324,7 +328,7 @@ __vtop4_x86_64(unsigned long vaddr, unsigned long pagetable)
|
|
||||||
/*
|
|
||||||
* Get P4D.
|
|
||||||
*/
|
|
||||||
- p4d_paddr = pgd & ENTRY_MASK;
|
|
||||||
+ p4d_paddr = pgd & entry_mask;
|
|
||||||
p4d_paddr += p4d_index(vaddr) * sizeof(unsigned long);
|
|
||||||
if (!readmem(PADDR, p4d_paddr, &p4d_pte, sizeof p4d_pte)) {
|
|
||||||
ERRMSG("Can't get p4d_pte (p4d_paddr:%lx).\n", p4d_paddr);
|
|
||||||
@@ -337,7 +341,7 @@ __vtop4_x86_64(unsigned long vaddr, unsigned long pagetable)
|
|
||||||
ERRMSG("Can't get a valid p4d_pte.\n");
|
|
||||||
return NOT_PADDR;
|
|
||||||
}
|
|
||||||
- pud_paddr = p4d_pte & ENTRY_MASK;
|
|
||||||
+ pud_paddr = p4d_pte & entry_mask;
|
|
||||||
}else {
|
|
||||||
page_dir += pgd_index(vaddr) * sizeof(unsigned long);
|
|
||||||
if (!readmem(PADDR, page_dir, &pgd, sizeof pgd)) {
|
|
||||||
@@ -351,7 +355,7 @@ __vtop4_x86_64(unsigned long vaddr, unsigned long pagetable)
|
|
||||||
ERRMSG("Can't get a valid pgd.\n");
|
|
||||||
return NOT_PADDR;
|
|
||||||
}
|
|
||||||
- pud_paddr = pgd & ENTRY_MASK;
|
|
||||||
+ pud_paddr = pgd & entry_mask;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
@@ -370,13 +374,13 @@ __vtop4_x86_64(unsigned long vaddr, unsigned long pagetable)
|
|
||||||
return NOT_PADDR;
|
|
||||||
}
|
|
||||||
if (pud_pte & _PAGE_PSE) /* 1GB pages */
|
|
||||||
- return (pud_pte & ENTRY_MASK & PUD_MASK) +
|
|
||||||
+ return (pud_pte & entry_mask & PUD_MASK) +
|
|
||||||
(vaddr & ~PUD_MASK);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get PMD.
|
|
||||||
*/
|
|
||||||
- pmd_paddr = pud_pte & ENTRY_MASK;
|
|
||||||
+ pmd_paddr = pud_pte & entry_mask;
|
|
||||||
pmd_paddr += pmd_index(vaddr) * sizeof(unsigned long);
|
|
||||||
if (!readmem(PADDR, pmd_paddr, &pmd_pte, sizeof pmd_pte)) {
|
|
||||||
ERRMSG("Can't get pmd_pte (pmd_paddr:%lx).\n", pmd_paddr);
|
|
||||||
@@ -390,13 +394,13 @@ __vtop4_x86_64(unsigned long vaddr, unsigned long pagetable)
|
|
||||||
return NOT_PADDR;
|
|
||||||
}
|
|
||||||
if (pmd_pte & _PAGE_PSE) /* 2MB pages */
|
|
||||||
- return (pmd_pte & ENTRY_MASK & PMD_MASK) +
|
|
||||||
+ return (pmd_pte & entry_mask & PMD_MASK) +
|
|
||||||
(vaddr & ~PMD_MASK);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get PTE.
|
|
||||||
*/
|
|
||||||
- pte_paddr = pmd_pte & ENTRY_MASK;
|
|
||||||
+ pte_paddr = pmd_pte & entry_mask;
|
|
||||||
pte_paddr += pte_index(vaddr) * sizeof(unsigned long);
|
|
||||||
if (!readmem(PADDR, pte_paddr, &pte, sizeof pte)) {
|
|
||||||
ERRMSG("Can't get pte (pte_paddr:%lx).\n", pte_paddr);
|
|
||||||
@@ -409,7 +413,7 @@ __vtop4_x86_64(unsigned long vaddr, unsigned long pagetable)
|
|
||||||
ERRMSG("Can't get a valid pte.\n");
|
|
||||||
return NOT_PADDR;
|
|
||||||
}
|
|
||||||
- return (pte & ENTRY_MASK) + PAGEOFFSET(vaddr);
|
|
||||||
+ return (pte & entry_mask) + PAGEOFFSET(vaddr);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned long long
|
|
||||||
@@ -642,6 +646,7 @@ find_vmemmap_x86_64()
|
|
||||||
unsigned long pmd, tpfn;
|
|
||||||
unsigned long pvaddr = 0;
|
|
||||||
unsigned long data_addr = 0, last_data_addr = 0, start_data_addr = 0;
|
|
||||||
+ unsigned long pmask = PMASK;
|
|
||||||
/*
|
|
||||||
* data_addr is the paddr of the page holding the page structs.
|
|
||||||
* We keep lists of contiguous pages and the pfn's that their
|
|
||||||
@@ -662,6 +667,9 @@ find_vmemmap_x86_64()
|
|
||||||
return FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ if (NUMBER(sme_mask) != NOT_FOUND_NUMBER)
|
|
||||||
+ pmask &= ~(NUMBER(sme_mask));
|
|
||||||
+
|
|
||||||
pagestructsize = size_table.page;
|
|
||||||
hugepagesize = PTRS_PER_PMD * info->page_size;
|
|
||||||
vaddr_base = info->vmemmap_start;
|
|
||||||
@@ -692,7 +700,7 @@ find_vmemmap_x86_64()
|
|
||||||
}
|
|
||||||
|
|
||||||
/* mask the pgd entry for the address of the pud page */
|
|
||||||
- pud_addr &= PMASK;
|
|
||||||
+ pud_addr &= pmask;
|
|
||||||
if (pud_addr == 0)
|
|
||||||
continue;
|
|
||||||
/* read the entire pud page */
|
|
||||||
@@ -705,7 +713,7 @@ find_vmemmap_x86_64()
|
|
||||||
/* pudp points to an entry in the pud page */
|
|
||||||
for (pudp = (unsigned long *)pud_page, pudindex = 0;
|
|
||||||
pudindex < PTRS_PER_PUD; pudindex++, pudp++) {
|
|
||||||
- pmd_addr = *pudp & PMASK;
|
|
||||||
+ pmd_addr = *pudp & pmask;
|
|
||||||
/* read the entire pmd page */
|
|
||||||
if (pmd_addr == 0)
|
|
||||||
continue;
|
|
||||||
@@ -747,7 +755,7 @@ find_vmemmap_x86_64()
|
|
||||||
* - we discontiguous page is a string of valids
|
|
||||||
*/
|
|
||||||
if (pmd) {
|
|
||||||
- data_addr = (pmd & PMASK);
|
|
||||||
+ data_addr = (pmd & pmask);
|
|
||||||
if (start_range) {
|
|
||||||
/* first-time kludge */
|
|
||||||
start_data_addr = data_addr;
|
|
||||||
diff --git a/makedumpfile.c b/makedumpfile.c
|
|
||||||
index 7dfe70fb8792..590f759c84f1 100644
|
|
||||||
--- a/makedumpfile-1.6.5/makedumpfile.c
|
|
||||||
+++ b/makedumpfile-1.6.5/makedumpfile.c
|
|
||||||
@@ -993,6 +993,8 @@ next_page:
|
|
||||||
read_size = MIN(info->page_size - PAGEOFFSET(paddr), size);
|
|
||||||
|
|
||||||
pgaddr = PAGEBASE(paddr);
|
|
||||||
+ if (NUMBER(sme_mask) != NOT_FOUND_NUMBER)
|
|
||||||
+ pgaddr = pgaddr & ~(NUMBER(sme_mask));
|
|
||||||
pgbuf = cache_search(pgaddr, read_size);
|
|
||||||
if (!pgbuf) {
|
|
||||||
++cache_miss;
|
|
||||||
@@ -2292,6 +2294,7 @@ write_vmcoreinfo_data(void)
|
|
||||||
WRITE_NUMBER("NR_FREE_PAGES", NR_FREE_PAGES);
|
|
||||||
WRITE_NUMBER("N_ONLINE", N_ONLINE);
|
|
||||||
WRITE_NUMBER("pgtable_l5_enabled", pgtable_l5_enabled);
|
|
||||||
+ WRITE_NUMBER("sme_mask", sme_mask);
|
|
||||||
|
|
||||||
WRITE_NUMBER("PG_lru", PG_lru);
|
|
||||||
WRITE_NUMBER("PG_private", PG_private);
|
|
||||||
@@ -2695,6 +2698,7 @@ read_vmcoreinfo(void)
|
|
||||||
READ_NUMBER("NR_FREE_PAGES", NR_FREE_PAGES);
|
|
||||||
READ_NUMBER("N_ONLINE", N_ONLINE);
|
|
||||||
READ_NUMBER("pgtable_l5_enabled", pgtable_l5_enabled);
|
|
||||||
+ READ_NUMBER("sme_mask", sme_mask);
|
|
||||||
|
|
||||||
READ_NUMBER("PG_lru", PG_lru);
|
|
||||||
READ_NUMBER("PG_private", PG_private);
|
|
||||||
diff --git a/makedumpfile.h b/makedumpfile.h
|
|
||||||
index 2e73beca48c5..5ad38e9ae40c 100644
|
|
||||||
--- a/makedumpfile-1.6.5/makedumpfile.h
|
|
||||||
+++ b/makedumpfile-1.6.5/makedumpfile.h
|
|
||||||
@@ -1913,6 +1913,7 @@ struct number_table {
|
|
||||||
long NR_FREE_PAGES;
|
|
||||||
long N_ONLINE;
|
|
||||||
long pgtable_l5_enabled;
|
|
||||||
+ long sme_mask;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Page flags
|
|
||||||
--
|
|
||||||
2.17.1
|
|
||||||
|
|
|
@ -1,129 +0,0 @@
|
||||||
From fb5a8792e6e4ee7de7ae3e06d193ea5beaaececc Mon Sep 17 00:00:00 2001
|
|
||||||
From: Kairui Song <kasong@redhat.com>
|
|
||||||
Date: Tue, 5 Mar 2019 19:34:33 +0800
|
|
||||||
Subject: [PATCH] x86: Introduce a new option --reuse-video-type
|
|
||||||
|
|
||||||
After commit 060eee58 "x86: use old screen_info if needed", kexec-tools
|
|
||||||
will force use old screen_info and vga type if failed to determine
|
|
||||||
current vga type. But it is not always a good idea.
|
|
||||||
|
|
||||||
Currently kernel hanging is inspected on some hyper-v VMs after this
|
|
||||||
commit, because hyperv_fb will mimic EFI (or VESA) VGA on first boot
|
|
||||||
up, but after the real driver is loaded, it will switch to new mode
|
|
||||||
and no longer compatible with EFI/VESA VGA. Keep setting
|
|
||||||
orig_video_isVGA to EFI/VESA VGA flag will get wrong driver loaded and
|
|
||||||
try to manipulate the framebuffer in a wrong way.
|
|
||||||
|
|
||||||
We can't ensure this won't happen on other framebuffer drivers, But
|
|
||||||
it's a helpful feature if the framebuffer drivers just work. So this
|
|
||||||
patch introduce a --reuse-video-type options to let user decide if the
|
|
||||||
old screen_info hould be used unconditional or not.
|
|
||||||
|
|
||||||
Signed-off-by: Kairui Song <kasong@redhat.com>
|
|
||||||
Reviewed-by: Dave Young <dyoung@redhat.com>
|
|
||||||
Signed-off-by: Simon Horman <horms@verge.net.au>
|
|
||||||
---
|
|
||||||
kexec/arch/i386/include/arch/options.h | 2 ++
|
|
||||||
kexec/arch/i386/kexec-x86.h | 1 +
|
|
||||||
kexec/arch/i386/x86-linux-setup.c | 8 ++++++--
|
|
||||||
kexec/arch/x86_64/kexec-x86_64.c | 5 +++++
|
|
||||||
4 files changed, 14 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/kexec/arch/i386/include/arch/options.h b/kexec/arch/i386/include/arch/options.h
|
|
||||||
index c113a83..0e57951 100644
|
|
||||||
--- a/kexec/arch/i386/include/arch/options.h
|
|
||||||
+++ b/kexec/arch/i386/include/arch/options.h
|
|
||||||
@@ -32,6 +32,7 @@
|
|
||||||
#define OPT_ENTRY_32BIT (OPT_ARCH_MAX+10)
|
|
||||||
#define OPT_PASS_MEMMAP_CMDLINE (OPT_ARCH_MAX+11)
|
|
||||||
#define OPT_NOEFI (OPT_ARCH_MAX+12)
|
|
||||||
+#define OPT_REUSE_VIDEO_TYPE (OPT_ARCH_MAX+13)
|
|
||||||
|
|
||||||
/* Options relevant to the architecture (excluding loader-specific ones): */
|
|
||||||
#define KEXEC_ARCH_OPTIONS \
|
|
||||||
@@ -45,6 +46,7 @@
|
|
||||||
{ "elf64-core-headers", 0, 0, OPT_ELF64_CORE }, \
|
|
||||||
{ "pass-memmap-cmdline", 0, 0, OPT_PASS_MEMMAP_CMDLINE }, \
|
|
||||||
{ "noefi", 0, 0, OPT_NOEFI}, \
|
|
||||||
+ { "reuse-video-type", 0, 0, OPT_REUSE_VIDEO_TYPE }, \
|
|
||||||
|
|
||||||
#define KEXEC_ARCH_OPT_STR KEXEC_OPT_STR ""
|
|
||||||
|
|
||||||
diff --git a/kexec/arch/i386/kexec-x86.h b/kexec/arch/i386/kexec-x86.h
|
|
||||||
index 51855f8..c2bcd37 100644
|
|
||||||
--- a/kexec/arch/i386/kexec-x86.h
|
|
||||||
+++ b/kexec/arch/i386/kexec-x86.h
|
|
||||||
@@ -52,6 +52,7 @@ struct arch_options_t {
|
|
||||||
enum coretype core_header_type;
|
|
||||||
uint8_t pass_memmap_cmdline;
|
|
||||||
uint8_t noefi;
|
|
||||||
+ uint8_t reuse_video_type;
|
|
||||||
};
|
|
||||||
|
|
||||||
int multiboot_x86_probe(const char *buf, off_t len);
|
|
||||||
diff --git a/kexec/arch/i386/x86-linux-setup.c b/kexec/arch/i386/x86-linux-setup.c
|
|
||||||
index 1bd408b..8fad115 100644
|
|
||||||
--- a/kexec/arch/i386/x86-linux-setup.c
|
|
||||||
+++ b/kexec/arch/i386/x86-linux-setup.c
|
|
||||||
@@ -144,7 +144,7 @@ static int setup_linux_vesafb(struct x86_linux_param_header *real_mode)
|
|
||||||
} else if (0 == strcmp(fix.id, "EFI VGA")) {
|
|
||||||
/* VIDEO_TYPE_EFI */
|
|
||||||
real_mode->orig_video_isVGA = 0x70;
|
|
||||||
- } else {
|
|
||||||
+ } else if (arch_options.reuse_video_type) {
|
|
||||||
int err;
|
|
||||||
off_t offset = offsetof(typeof(*real_mode), orig_video_isVGA);
|
|
||||||
|
|
||||||
@@ -152,6 +152,10 @@ static int setup_linux_vesafb(struct x86_linux_param_header *real_mode)
|
|
||||||
err = get_bootparam(&real_mode->orig_video_isVGA, offset, 1);
|
|
||||||
if (err)
|
|
||||||
goto out;
|
|
||||||
+ } else {
|
|
||||||
+ real_mode->orig_video_isVGA = 0;
|
|
||||||
+ close(fd);
|
|
||||||
+ return 0;
|
|
||||||
}
|
|
||||||
close(fd);
|
|
||||||
|
|
||||||
@@ -844,7 +848,7 @@ void setup_linux_system_parameters(struct kexec_info *info,
|
|
||||||
setup_subarch(real_mode);
|
|
||||||
if (bzImage_support_efi_boot && !arch_options.noefi)
|
|
||||||
setup_efi_info(info, real_mode);
|
|
||||||
-
|
|
||||||
+
|
|
||||||
/* Default screen size */
|
|
||||||
real_mode->orig_x = 0;
|
|
||||||
real_mode->orig_y = 0;
|
|
||||||
diff --git a/kexec/arch/x86_64/kexec-x86_64.c b/kexec/arch/x86_64/kexec-x86_64.c
|
|
||||||
index 041b007..ccdc980 100644
|
|
||||||
--- a/kexec/arch/x86_64/kexec-x86_64.c
|
|
||||||
+++ b/kexec/arch/x86_64/kexec-x86_64.c
|
|
||||||
@@ -55,6 +55,7 @@ void arch_usage(void)
|
|
||||||
" --console-serial Enable the serial console\n"
|
|
||||||
" --pass-memmap-cmdline Pass memory map via command line in kexec on panic case\n"
|
|
||||||
" --noefi Disable efi support\n"
|
|
||||||
+ " --reuse-video-type Reuse old boot time video type blindly\n"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -67,6 +68,7 @@ struct arch_options_t arch_options = {
|
|
||||||
.core_header_type = CORE_TYPE_ELF64,
|
|
||||||
.pass_memmap_cmdline = 0,
|
|
||||||
.noefi = 0,
|
|
||||||
+ .reuse_video_type = 0,
|
|
||||||
};
|
|
||||||
|
|
||||||
int arch_process_options(int argc, char **argv)
|
|
||||||
@@ -136,6 +138,9 @@ int arch_process_options(int argc, char **argv)
|
|
||||||
case OPT_NOEFI:
|
|
||||||
arch_options.noefi = 1;
|
|
||||||
break;
|
|
||||||
+ case OPT_REUSE_VIDEO_TYPE:
|
|
||||||
+ arch_options.reuse_video_type = 1;
|
|
||||||
+ break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* Reset getopt for the next pass; called in other source modules */
|
|
||||||
--
|
|
||||||
2.20.1
|
|
||||||
|
|
|
@ -0,0 +1,72 @@
|
||||||
|
From 58553ad03187f0cf208d6c4a0dc026c6338e5edd Mon Sep 17 00:00:00 2001
|
||||||
|
From: "Daisuke Hatayama (Fujitsu)" <d.hatayama@fujitsu.com>
|
||||||
|
Date: Wed, 29 Mar 2023 12:44:10 +0000
|
||||||
|
Subject: [PATCH] [PATCH] sadump: fix failure of reading memory when 5-level
|
||||||
|
paging is enabled
|
||||||
|
|
||||||
|
makedumpfile fails as follows for memory dumps collected by sadump
|
||||||
|
when 5-level paging is enabled on the corresponding systems:
|
||||||
|
|
||||||
|
# makedumpfile -l -d 31 -x ./vmlinux ./dump.sadump dump.sadump-ld31
|
||||||
|
__vtop4_x86_64: Can't get a valid pgd.
|
||||||
|
...snip...
|
||||||
|
__vtop4_x86_64: Can't get a valid pgd.
|
||||||
|
calc_kaslr_offset: failed to calculate kaslr_offset and phys_base; default to 0
|
||||||
|
__vtop4_x86_64: Can't get a valid pgd.
|
||||||
|
readmem: Can't convert a virtual address(ffffffff82fce960) to physical address.
|
||||||
|
readmem: type_addr: 0, addr:ffffffff82fce960, size:1024
|
||||||
|
cpu_online_mask_init: Can't read cpu_online_mask memory.
|
||||||
|
|
||||||
|
makedumpfile Failed.
|
||||||
|
|
||||||
|
This is because 5-level paging support has not been done yet for
|
||||||
|
sadump; the work of the 5-level paging support was done by the commit
|
||||||
|
30a3214a7193e94c551c0cebda5918a72a35c589 (PATCH 4/4 arch/x86_64: Add
|
||||||
|
5-level paging support) but that was focused on the core part only.
|
||||||
|
|
||||||
|
Having said that, most of things has already been finished in the
|
||||||
|
commit. What needs to be newly added for sadump is just how to check
|
||||||
|
if 5-level paging is enabled for a given memory dump.
|
||||||
|
|
||||||
|
For that purpose, let's refer to CR4.LA57, bit 12 of CR4, representing
|
||||||
|
whether 5-level paging is enabled or not. We can do this because
|
||||||
|
memory dumps collected by sadump have SMRAM as note information and
|
||||||
|
they include CR4 together with the other control registers.
|
||||||
|
|
||||||
|
Signed-off-by: HATAYAMA Daisuke <d.hatayama@fujitsu.com>
|
||||||
|
---
|
||||||
|
sadump_info.c | 4 ++++
|
||||||
|
1 file changed, 4 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/makedumpfile-1.7.2/sadump_info.c b/makedumpfile-1.7.2/sadump_info.c
|
||||||
|
index adfa8dc..2c44068 100644
|
||||||
|
--- a/makedumpfile-1.7.2/sadump_info.c
|
||||||
|
+++ b/makedumpfile-1.7.2/sadump_info.c
|
||||||
|
@@ -1362,6 +1362,7 @@ static int linux_banner_sanity_check(ulong cr3)
|
||||||
|
#define PTI_USER_PGTABLE_BIT (info->page_shift)
|
||||||
|
#define PTI_USER_PGTABLE_MASK (1 << PTI_USER_PGTABLE_BIT)
|
||||||
|
#define CR3_PCID_MASK 0xFFFull
|
||||||
|
+#define CR4_LA57 (1 << 12)
|
||||||
|
int
|
||||||
|
calc_kaslr_offset(void)
|
||||||
|
{
|
||||||
|
@@ -1397,6 +1398,8 @@ calc_kaslr_offset(void)
|
||||||
|
else
|
||||||
|
cr3 = smram.Cr3 & ~CR3_PCID_MASK;
|
||||||
|
|
||||||
|
+ NUMBER(pgtable_l5_enabled) = !!(smram.Cr4 & CR4_LA57);
|
||||||
|
+
|
||||||
|
/* Convert virtual address of IDT table to physical address */
|
||||||
|
idtr_paddr = vtop4_x86_64_pagetable(idtr, cr3);
|
||||||
|
if (idtr_paddr == NOT_PADDR) {
|
||||||
|
@@ -1417,6 +1420,7 @@ calc_kaslr_offset(void)
|
||||||
|
|
||||||
|
DEBUG_MSG("sadump: idtr=%" PRIx64 "\n", idtr);
|
||||||
|
DEBUG_MSG("sadump: cr3=%" PRIx64 "\n", cr3);
|
||||||
|
+ DEBUG_MSG("sadump: cr4=%" PRIx32 "\n", smram.Cr4);
|
||||||
|
DEBUG_MSG("sadump: idtr(phys)=%" PRIx64 "\n", idtr_paddr);
|
||||||
|
DEBUG_MSG("sadump: devide_error(vmlinux)=%lx\n",
|
||||||
|
divide_error_vmlinux);
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
353
SOURCES/mkdumprd
353
SOURCES/mkdumprd
|
@ -6,134 +6,89 @@
|
||||||
# Written by Cong Wang <amwang@redhat.com>
|
# Written by Cong Wang <amwang@redhat.com>
|
||||||
#
|
#
|
||||||
|
|
||||||
|
if [ -f /etc/sysconfig/kdump ]; then
|
||||||
|
. /etc/sysconfig/kdump
|
||||||
|
fi
|
||||||
|
|
||||||
[[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
|
[[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
|
||||||
. $dracutbasedir/dracut-functions.sh
|
. $dracutbasedir/dracut-functions.sh
|
||||||
. /lib/kdump/kdump-lib.sh
|
. /lib/kdump/kdump-lib.sh
|
||||||
|
. /lib/kdump/kdump-logger.sh
|
||||||
export IN_KDUMP=1
|
export IN_KDUMP=1
|
||||||
|
|
||||||
|
#initiate the kdump logger
|
||||||
|
dlog_init
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "failed to initiate the kdump logger."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
conf_file="/etc/kdump.conf"
|
conf_file="/etc/kdump.conf"
|
||||||
SSH_KEY_LOCATION="/root/.ssh/kdump_id_rsa"
|
SSH_KEY_LOCATION="/root/.ssh/kdump_id_rsa"
|
||||||
SAVE_PATH=$(awk '/^path/ {print $2}' $conf_file)
|
SAVE_PATH=$(get_save_path)
|
||||||
[ -z "$SAVE_PATH" ] && SAVE_PATH=$DEFAULT_PATH
|
|
||||||
# strip the duplicated "/"
|
|
||||||
SAVE_PATH=$(echo $SAVE_PATH | tr -s /)
|
|
||||||
|
|
||||||
is_wdt_addition_needed() {
|
|
||||||
local active
|
|
||||||
|
|
||||||
is_wdt_mod_omitted
|
|
||||||
[[ $? -eq 0 ]] && return 1
|
|
||||||
[[ -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
|
|
||||||
}
|
|
||||||
|
|
||||||
WDTCFG=""
|
|
||||||
is_wdt_addition_needed
|
|
||||||
[[ $? -eq 0 ]] && WDTCFG="-a watchdog"
|
|
||||||
|
|
||||||
extra_modules=""
|
|
||||||
dracut_args=("--quiet" "--hostonly" "--hostonly-cmdline" "--hostonly-i18n" "--hostonly-mode" "strict" "-o" "plymouth dash resume ifcfg earlykdump" $WDTCFG)
|
|
||||||
OVERRIDE_RESETTABLE=0
|
OVERRIDE_RESETTABLE=0
|
||||||
|
|
||||||
add_dracut_arg() {
|
extra_modules=""
|
||||||
local arg qarg is_quoted=0
|
dracut_args="--add kdumpbase --quiet --hostonly --hostonly-cmdline --hostonly-i18n --hostonly-mode strict --hostonly-nics '' -o \"plymouth dash resume ifcfg earlykdump\" --compress=xz"
|
||||||
while [ $# -gt 0 ];
|
|
||||||
do
|
|
||||||
arg="${1//\'/\"}"
|
|
||||||
#Handle quoted substring properly for passing it to dracut_args array.
|
|
||||||
if [ $is_quoted -eq 0 ]; then
|
|
||||||
if [[ "$arg" == "\"" ]] || [[ $arg != ${arg#\"} ]]; then
|
|
||||||
is_quoted=1
|
|
||||||
arg=${arg#\"}
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
if [ $is_quoted -eq 1 ]; then
|
|
||||||
qarg="$qarg $arg"
|
|
||||||
if [[ "$arg" == "\"" ]] || [[ $arg != ${arg%\"} ]]; then
|
|
||||||
is_quoted=0
|
|
||||||
arg=${qarg%\"}
|
|
||||||
qarg=""
|
|
||||||
else
|
|
||||||
shift
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
dracut_args+=("$arg")
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
add_dracut_module() {
|
readonly MKDUMPRD_TMPDIR="$(mktemp -d -t mkdumprd.XXXXXX)"
|
||||||
add_dracut_arg "--add" "$1"
|
[ -d "$MKDUMPRD_TMPDIR" ] || perror_exit "dracut: mktemp -p -d -t dracut.XXXXXX failed."
|
||||||
|
readonly MKDUMPRD_TMPMNT="$MKDUMPRD_TMPDIR/target"
|
||||||
|
|
||||||
|
trap '
|
||||||
|
ret=$?;
|
||||||
|
is_mounted $MKDUMPRD_TMPMNT && umount -f $MKDUMPRD_TMPMNT;
|
||||||
|
[[ -d $MKDUMPRD_TMPDIR ]] && rm --one-file-system -rf -- "$MKDUMPRD_TMPDIR";
|
||||||
|
exit $ret;
|
||||||
|
' EXIT
|
||||||
|
|
||||||
|
# clean up after ourselves no matter how we die.
|
||||||
|
trap 'exit 1;' SIGINT
|
||||||
|
|
||||||
|
add_dracut_arg() {
|
||||||
|
dracut_args="$dracut_args $@"
|
||||||
}
|
}
|
||||||
|
|
||||||
add_dracut_mount() {
|
add_dracut_mount() {
|
||||||
add_dracut_arg "--mount" "$1"
|
add_dracut_arg "--mount" "\"$1\""
|
||||||
}
|
}
|
||||||
|
|
||||||
add_dracut_sshkey() {
|
add_dracut_sshkey() {
|
||||||
add_dracut_arg "--sshkey" "$1"
|
add_dracut_arg "--sshkey" "\"$1\""
|
||||||
}
|
}
|
||||||
|
|
||||||
# caller should ensure $1 is valid and mounted in 1st kernel
|
# caller should ensure $1 is valid and mounted in 1st kernel
|
||||||
to_mount() {
|
to_mount() {
|
||||||
local _dev=$1 _source _target _fstype _options _mntopts _pdev
|
local _target=$1 _fstype=$2 _options=$3 _new_mntpoint _pdev
|
||||||
|
|
||||||
_source=$(findmnt -k -f -n -r -o SOURCE $_dev)
|
_new_mntpoint=$(get_kdump_mntpoint_from_target $_target)
|
||||||
_target=$(get_mntpoint_from_target $_dev)
|
_fstype="${_fstype:-$(get_fs_type_from_target $_target)}"
|
||||||
# mount under /sysroot if dump to root disk or mount under
|
_options="${_options:-$(get_mntopt_from_target $_target)}"
|
||||||
#/kdumproot/$_target in other cases in 2nd kernel. systemd
|
_options="${_options:-defaults}"
|
||||||
#will be in charge to umount it.
|
|
||||||
|
|
||||||
if [ "$_target" = "/" ];then
|
if [[ "$_fstype" == "nfs"* ]]; then
|
||||||
_target="/sysroot"
|
_pdev=$_target
|
||||||
|
_options=$(echo $_options | sed 's/,\(mount\)\?addr=[^,]*//g')
|
||||||
|
_options=$(echo $_options | sed 's/,\(mount\)\?proto=[^,]*//g')
|
||||||
|
_options=$(echo $_options | sed 's/,clientaddr=[^,]*//')
|
||||||
else
|
else
|
||||||
_target="/kdumproot/$_target"
|
# for non-nfs _target converting to use udev persistent name
|
||||||
fi
|
_pdev="$(kdump_get_persistent_dev $_target)"
|
||||||
|
if [ -z "$_pdev" ]; then
|
||||||
_fstype=$(findmnt -k -f -n -r -o FSTYPE $_dev)
|
return 1
|
||||||
[[ -e /etc/fstab ]] && _options=$(findmnt --fstab -f -n -r -o OPTIONS $_dev)
|
|
||||||
if [ -z "$_options" ]; then
|
|
||||||
_options=$(findmnt -k -f -n -r -o OPTIONS $_dev)
|
|
||||||
if [[ $_fstype == "nfs"* ]]; then
|
|
||||||
_options=$(echo $_options | sed 's/,addr=[^,]*//')
|
|
||||||
_options=$(echo $_options | sed 's/,proto=[^,]*//')
|
|
||||||
_options=$(echo $_options | sed 's/,clientaddr=[^,]*//')
|
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
#mount fs target as rw in 2nd kernel
|
#mount fs target as rw in 2nd kernel
|
||||||
_options=$(echo $_options | sed 's/\(^\|,\)ro\($\|,\)/\1rw\2/g')
|
_options=$(echo $_options | sed 's/\(^\|,\)ro\($\|,\)/\1rw\2/g')
|
||||||
# with 'noauto' in fstab nfs and non-root disk mount will fail in 2nd
|
# with 'noauto' in fstab nfs and non-root disk mount will fail in 2nd
|
||||||
# kernel, filter it out here.
|
# kernel, filter it out here.
|
||||||
_options=$(echo $_options | sed 's/\(^\|,\)noauto\($\|,\)/\1/g')
|
_options=$(echo $_options | sed 's/\(^\|,\)noauto\($\|,\)/\1/g')
|
||||||
|
# use both nofail and x-systemd.before to ensure systemd will try best to
|
||||||
|
# mount it before kdump starts, this is an attempt to improve robustness
|
||||||
|
_options="$_options,nofail,x-systemd.before=initrd-fs.target"
|
||||||
|
|
||||||
_mntopts="$_target $_fstype $_options"
|
echo "$_pdev $_new_mntpoint $_fstype $_options"
|
||||||
#for non-nfs _dev converting to use udev persistent name
|
|
||||||
if [ -b "$_source" ]; then
|
|
||||||
_pdev="$(get_persistent_dev $_source)"
|
|
||||||
if [ -z "$_pdev" ]; then
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
else
|
|
||||||
_pdev=$_dev
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "$_pdev $_mntopts"
|
|
||||||
}
|
|
||||||
|
|
||||||
is_readonly_mount() {
|
|
||||||
local _mnt
|
|
||||||
_mnt=$(findmnt -k -f -n -r -o OPTIONS $1)
|
|
||||||
|
|
||||||
#fs/proc_namespace.c: show_mountinfo():
|
|
||||||
#seq_puts(m, mnt->mnt_flags & MNT_READONLY ? " ro" : " rw");
|
|
||||||
[[ "$_mnt" =~ ^ro ]]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#Function: get_ssh_size
|
#Function: get_ssh_size
|
||||||
|
@ -154,7 +109,7 @@ get_ssh_size() {
|
||||||
|
|
||||||
#mkdir if save path does not exist on ssh dump target
|
#mkdir if save path does not exist on ssh dump target
|
||||||
#$1=ssh dump target
|
#$1=ssh dump target
|
||||||
#caller should ensure write permission on $DUMP_TARGET:$SAVE_PATH
|
#caller should ensure write permission on $1:$SAVE_PATH
|
||||||
#called from while loop and shouldn't read from stdin, so we're using "ssh -n"
|
#called from while loop and shouldn't read from stdin, so we're using "ssh -n"
|
||||||
mkdir_save_path_ssh()
|
mkdir_save_path_ssh()
|
||||||
{
|
{
|
||||||
|
@ -163,14 +118,14 @@ mkdir_save_path_ssh()
|
||||||
ssh -qn $_opt $1 mkdir -p $SAVE_PATH 2>&1 > /dev/null
|
ssh -qn $_opt $1 mkdir -p $SAVE_PATH 2>&1 > /dev/null
|
||||||
_ret=$?
|
_ret=$?
|
||||||
if [ $_ret -ne 0 ]; then
|
if [ $_ret -ne 0 ]; then
|
||||||
perror_exit "mkdir failed on $DUMP_TARGET:$SAVE_PATH"
|
perror_exit "mkdir failed on $1:$SAVE_PATH"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
#check whether user has write permission on $SAVE_PATH/$DUMP_TARGET
|
#check whether user has write permission on $1:$SAVE_PATH
|
||||||
_dir=$(ssh -qn $_opt $1 mktemp -dqp $SAVE_PATH 2>/dev/null)
|
_dir=$(ssh -qn $_opt $1 mktemp -dqp $SAVE_PATH 2>/dev/null)
|
||||||
_ret=$?
|
_ret=$?
|
||||||
if [ $_ret -ne 0 ]; then
|
if [ $_ret -ne 0 ]; then
|
||||||
perror_exit "Could not create temporary directory on $DUMP_TARGET:$SAVE_PATH. Make sure user has write permission on destination"
|
perror_exit "Could not create temporary directory on $1:$SAVE_PATH. Make sure user has write permission on destination"
|
||||||
fi
|
fi
|
||||||
ssh -qn $_opt $1 rmdir $_dir
|
ssh -qn $_opt $1 rmdir $_dir
|
||||||
|
|
||||||
|
@ -216,27 +171,100 @@ check_size() {
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ $avail -lt $memtotal ]; then
|
if [ $avail -lt $memtotal ]; then
|
||||||
echo "Warning: There might not be enough space to save a vmcore."
|
dwarn "Warning: There might not be enough space to save a vmcore."
|
||||||
echo " The size of $2 should be greater than $memtotal kilo bytes."
|
dwarn " The size of $2 should be greater than $memtotal kilo bytes."
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
check_save_path_fs()
|
||||||
|
{
|
||||||
|
local _path=$1
|
||||||
|
|
||||||
|
if [ ! -d $_path ]; then
|
||||||
|
perror_exit "Dump path $_path does not exist."
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
check_user_configured_target()
|
||||||
|
{
|
||||||
|
local _target=$1 _cfg_fs_type=$2 _mounted
|
||||||
|
local _mnt=$(get_mntpoint_from_target $_target)
|
||||||
|
local _opt=$(get_mntopt_from_target $_target)
|
||||||
|
local _fstype=$(get_fs_type_from_target $_target)
|
||||||
|
|
||||||
|
if [ -n "$_fstype" ]; then
|
||||||
|
# In case of nfs4, nfs should be used instead, nfs* options is deprecated in kdump.conf
|
||||||
|
[[ $_fstype = "nfs"* ]] && _fstype=nfs
|
||||||
|
|
||||||
|
if [ -n "$_cfg_fs_type" ] && [ "$_fstype" != "$_cfg_fs_type" ]; then
|
||||||
|
perror_exit "\"$_target\" have a wrong type config \"$_cfg_fs_type\", expected \"$_fstype\""
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
_fstype="$_cfg_fs_type"
|
||||||
|
_fstype="$_cfg_fs_type"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# For noauto mount, mount it inplace with default value.
|
||||||
|
# Else use the temporary target directory
|
||||||
|
if [ -n "$_mnt" ]; then
|
||||||
|
if ! is_mounted "$_mnt"; then
|
||||||
|
if [[ $_opt = *",noauto"* ]]; then
|
||||||
|
mount $_mnt
|
||||||
|
[ $? -ne 0 ] && perror_exit "Failed to mount $_target on $_mnt for kdump preflight check."
|
||||||
|
_mounted=$_mnt
|
||||||
|
else
|
||||||
|
perror_exit "Dump target \"$_target\" is neither mounted nor configured as \"noauto\""
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
_mnt=$MKDUMPRD_TMPMNT
|
||||||
|
mkdir -p $_mnt
|
||||||
|
mount $_target $_mnt -t $_fstype -o defaults
|
||||||
|
[ $? -ne 0 ] && perror_exit "Failed to mount $_target for kdump preflight check."
|
||||||
|
_mounted=$_mnt
|
||||||
|
fi
|
||||||
|
|
||||||
|
# For user configured target, use $SAVE_PATH as the dump path within the target
|
||||||
|
if [ ! -d "$_mnt/$SAVE_PATH" ]; then
|
||||||
|
perror_exit "Dump path \"$SAVE_PATH\" does not exist in dump target \"$_target\""
|
||||||
|
fi
|
||||||
|
|
||||||
|
check_size fs "$_target"
|
||||||
|
|
||||||
|
# Unmount it early, if function is interrupted and didn't reach here, the shell trap will clear it up anyway
|
||||||
|
if [ -n "$_mounted" ]; then
|
||||||
|
umount -f -- $_mounted
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# $1: core_collector config value
|
# $1: core_collector config value
|
||||||
verify_core_collector() {
|
verify_core_collector() {
|
||||||
if grep -q "^raw" $conf_file && [ "${1%% *}" != "makedumpfile" ]; then
|
local _cmd="${1%% *}"
|
||||||
echo "Warning: specifying a non-makedumpfile core collector, you will have to recover the vmcore manually."
|
local _params="${1#* }"
|
||||||
fi
|
|
||||||
if is_ssh_dump_target || is_raw_dump_target; then
|
if [ "$_cmd" != "makedumpfile" ]; then
|
||||||
if [ "${1%% *}" = "makedumpfile" ]; then
|
if is_raw_dump_target; then
|
||||||
! strstr "$1" "-F" && {
|
dwarn "Warning: specifying a non-makedumpfile core collector, you will have to recover the vmcore manually."
|
||||||
perror_exit "The specified dump target needs makedumpfile \"-F\" option."
|
|
||||||
}
|
|
||||||
fi
|
fi
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if is_ssh_dump_target || is_raw_dump_target; then
|
||||||
|
if ! strstr "$_params" "-F"; then
|
||||||
|
perror_exit "The specified dump target needs makedumpfile \"-F\" option."
|
||||||
|
fi
|
||||||
|
_params="$_params vmcore"
|
||||||
|
else
|
||||||
|
_params="$_params vmcore dumpfile"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! $_cmd --check-params $_params; then
|
||||||
|
perror_exit "makedumpfile parameter check failed."
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
add_mount() {
|
add_mount() {
|
||||||
local _mnt=$(to_mount "$1")
|
local _mnt=$(to_mount $@)
|
||||||
|
|
||||||
if [ $? -ne 0 ]; then
|
if [ $? -ne 0 ]; then
|
||||||
exit 1
|
exit 1
|
||||||
|
@ -255,20 +283,11 @@ handle_default_dump_target()
|
||||||
|
|
||||||
check_save_path_fs $SAVE_PATH
|
check_save_path_fs $SAVE_PATH
|
||||||
|
|
||||||
_mntpoint=$(get_mntpoint_from_path $SAVE_PATH)
|
_save_path=$(get_bind_mount_source $SAVE_PATH)
|
||||||
_target=$(get_target_from_path $SAVE_PATH)
|
_target=$(get_target_from_path $_save_path)
|
||||||
|
_mntpoint=$(get_mntpoint_from_target $_target)
|
||||||
|
|
||||||
if is_atomic && is_bind_mount $_mntpoint; then
|
SAVE_PATH=${_save_path##"$_mntpoint"}
|
||||||
SAVE_PATH=${SAVE_PATH##"$_mntpoint"}
|
|
||||||
# the real dump path in the 2nd kernel, if the mount point is bind mounted.
|
|
||||||
SAVE_PATH=$(get_bind_mount_directory $_mntpoint)/$SAVE_PATH
|
|
||||||
_mntpoint=$(get_mntpoint_from_target $_target)
|
|
||||||
|
|
||||||
# the absolute path in the 1st kernel
|
|
||||||
SAVE_PATH=$_mntpoint/$SAVE_PATH
|
|
||||||
fi
|
|
||||||
|
|
||||||
SAVE_PATH=${SAVE_PATH##"$_mntpoint"}
|
|
||||||
add_mount "$_target"
|
add_mount "$_target"
|
||||||
check_size fs $_target
|
check_size fs $_target
|
||||||
}
|
}
|
||||||
|
@ -286,7 +305,6 @@ get_override_resettable()
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
# $1: function name
|
# $1: function name
|
||||||
for_each_block_target()
|
for_each_block_target()
|
||||||
{
|
{
|
||||||
|
@ -301,8 +319,6 @@ for_each_block_target()
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#judge if a specific device with $1 is unresettable
|
#judge if a specific device with $1 is unresettable
|
||||||
#return false if unresettable.
|
#return false if unresettable.
|
||||||
is_unresettable()
|
is_unresettable()
|
||||||
|
@ -315,7 +331,7 @@ is_unresettable()
|
||||||
resettable="$(cat $path)"
|
resettable="$(cat $path)"
|
||||||
[ $resettable -eq 0 -a "$OVERRIDE_RESETTABLE" -eq 0 ] && {
|
[ $resettable -eq 0 -a "$OVERRIDE_RESETTABLE" -eq 0 ] && {
|
||||||
local device=$(udevadm info --query=all --path=/sys/dev/block/$1 | awk -F= '/DEVNAME/{print $2}')
|
local device=$(udevadm info --query=all --path=/sys/dev/block/$1 | awk -F= '/DEVNAME/{print $2}')
|
||||||
echo "Error: Can not save vmcore because device $device is unresettable"
|
derror "Error: Can not save vmcore because device $device is unresettable"
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
fi
|
fi
|
||||||
|
@ -339,32 +355,15 @@ check_resettable()
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
# $1: maj:min
|
|
||||||
is_crypt()
|
|
||||||
{
|
|
||||||
local majmin=$1 dev line ID_FS_TYPE=""
|
|
||||||
|
|
||||||
line=$(udevadm info --query=property --path=/sys/dev/block/$majmin \
|
|
||||||
| grep "^ID_FS_TYPE")
|
|
||||||
eval "$line"
|
|
||||||
[[ "$ID_FS_TYPE" = "crypto_LUKS" ]] && {
|
|
||||||
dev=$(udevadm info --query=all --path=/sys/dev/block/$majmin | awk -F= '/DEVNAME/{print $2}')
|
|
||||||
echo "Device $dev is encrypted."
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
check_crypt()
|
check_crypt()
|
||||||
{
|
{
|
||||||
local _ret _target
|
local _dev
|
||||||
|
|
||||||
for_each_block_target is_crypt
|
for _dev in $(get_kdump_targets); do
|
||||||
_ret=$?
|
if [[ -n $(get_luks_crypt_dev "$(get_maj_min "$_dev")") ]]; then
|
||||||
|
derror "Device $_dev is encrypted." && return 1
|
||||||
[ $_ret -eq 0 ] && return
|
fi
|
||||||
|
done
|
||||||
return 1
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ! check_resettable; then
|
if ! check_resettable; then
|
||||||
|
@ -372,7 +371,7 @@ if ! check_resettable; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! check_crypt; then
|
if ! check_crypt; then
|
||||||
echo "Warning: Encrypted device is in dump path. User will prompted for password during second kernel boot."
|
dwarn "Warning: Encrypted device is in dump path. User will prompted for password during second kernel boot."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# firstly get right SSH_KEY_LOCATION
|
# firstly get right SSH_KEY_LOCATION
|
||||||
|
@ -382,10 +381,6 @@ if [ -f "$keyfile" ]; then
|
||||||
SSH_KEY_LOCATION=$(/usr/bin/readlink -m $keyfile)
|
SSH_KEY_LOCATION=$(/usr/bin/readlink -m $keyfile)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$(uname -m)" = "s390x" ]; then
|
|
||||||
add_dracut_module "znet"
|
|
||||||
fi
|
|
||||||
|
|
||||||
while read config_opt config_val;
|
while read config_opt config_val;
|
||||||
do
|
do
|
||||||
# remove inline comments after the end of a directive.
|
# remove inline comments after the end of a directive.
|
||||||
|
@ -394,28 +389,15 @@ do
|
||||||
extra_modules="$extra_modules $config_val"
|
extra_modules="$extra_modules $config_val"
|
||||||
;;
|
;;
|
||||||
ext[234]|xfs|btrfs|minix|nfs)
|
ext[234]|xfs|btrfs|minix|nfs)
|
||||||
if ! findmnt $config_val >/dev/null; then
|
check_user_configured_target "$config_val" "$config_opt"
|
||||||
perror_exit "Dump target $config_val is probably not mounted."
|
add_mount "$config_val" "$config_opt"
|
||||||
fi
|
|
||||||
|
|
||||||
_absolute_save_path=$(make_absolute_save_path $config_val)
|
|
||||||
_mntpoint=$(get_mntpoint_from_path $_absolute_save_path)
|
|
||||||
if is_atomic && is_bind_mount $_mntpoint; then
|
|
||||||
SAVE_PATH=${_absolute_save_path##"$_mntpoint"}
|
|
||||||
# the real dump path in the 2nd kernel, if the mount point is bind mounted.
|
|
||||||
SAVE_PATH=$(get_bind_mount_directory $_mntpoint)/$SAVE_PATH
|
|
||||||
fi
|
|
||||||
|
|
||||||
add_mount "$config_val"
|
|
||||||
check_save_path_fs $_absolute_save_path
|
|
||||||
check_size fs $config_val
|
|
||||||
;;
|
;;
|
||||||
raw)
|
raw)
|
||||||
#checking raw disk writable
|
# checking raw disk writable
|
||||||
dd if=$config_val count=1 of=/dev/null > /dev/null 2>&1 || {
|
dd if=$config_val count=1 of=/dev/null > /dev/null 2>&1 || {
|
||||||
perror_exit "Bad raw disk $config_val"
|
perror_exit "Bad raw disk $config_val"
|
||||||
}
|
}
|
||||||
_praw=$(persistent_policy="by-id" get_persistent_dev $config_val)
|
_praw=$(persistent_policy="by-id" kdump_get_persistent_dev $config_val)
|
||||||
if [ -z "$_praw" ]; then
|
if [ -z "$_praw" ]; then
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
@ -425,10 +407,9 @@ do
|
||||||
ssh)
|
ssh)
|
||||||
if strstr "$config_val" "@";
|
if strstr "$config_val" "@";
|
||||||
then
|
then
|
||||||
check_size ssh $config_val
|
|
||||||
mkdir_save_path_ssh $config_val
|
mkdir_save_path_ssh $config_val
|
||||||
add_dracut_module "ssh-client"
|
check_size ssh $config_val
|
||||||
add_dracut_sshkey "$SSH_KEY_LOCATION"
|
add_dracut_sshkey "$SSH_KEY_LOCATION"
|
||||||
else
|
else
|
||||||
perror_exit "Bad ssh dump target $config_val"
|
perror_exit "Bad ssh dump target $config_val"
|
||||||
fi
|
fi
|
||||||
|
@ -448,18 +429,24 @@ handle_default_dump_target
|
||||||
|
|
||||||
if [ -n "$extra_modules" ]
|
if [ -n "$extra_modules" ]
|
||||||
then
|
then
|
||||||
add_dracut_arg "--add-drivers" "$extra_modules"
|
add_dracut_arg "--add-drivers" \"$extra_modules\"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# TODO: The below check is not needed anymore with the introduction of
|
||||||
|
# 'zz-fadumpinit' module, that isolates fadump's capture kernel initrd,
|
||||||
|
# but still sysroot.mount unit gets generated based on 'root=' kernel
|
||||||
|
# parameter available in fadump case. So, find a way to fix that first
|
||||||
|
# before removing this check.
|
||||||
if ! is_fadump_capable; then
|
if ! is_fadump_capable; then
|
||||||
# The 2nd rootfs mount stays behind the normal dump target mount,
|
# The 2nd rootfs mount stays behind the normal dump target mount,
|
||||||
# so it doesn't affect the logic of check_dump_fs_modified().
|
# so it doesn't affect the logic of check_dump_fs_modified().
|
||||||
is_dump_to_rootfs && add_mount "$(to_dev_name $(get_root_fs_device))"
|
is_dump_to_rootfs && add_mount "$(to_dev_name $(get_root_fs_device))"
|
||||||
|
|
||||||
add_dracut_arg "--no-hostonly-default-device"
|
add_dracut_arg "--no-hostonly-default-device"
|
||||||
|
|
||||||
|
if fips-mode-setup --is-enabled 2> /dev/null; then
|
||||||
|
add_dracut_arg --add-device "$(findmnt -n -o SOURCE --target /boot)"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
dracut "${dracut_args[@]}" "$@"
|
echo "$dracut_args $@" | xargs dracut
|
||||||
_rc=$?
|
|
||||||
sync
|
|
||||||
exit $_rc
|
|
||||||
|
|
|
@ -15,7 +15,13 @@ be loaded in the initramfs (based on configuration retrieved from
|
||||||
\fI/etc/kdump.conf)\fR
|
\fI/etc/kdump.conf)\fR
|
||||||
|
|
||||||
\fBmkdumprd\fR add a new \fBdracut\fR module 99kdumpbase and use \fBdracut\fR
|
\fBmkdumprd\fR add a new \fBdracut\fR module 99kdumpbase and use \fBdracut\fR
|
||||||
utility to generate the initramfs.
|
utility to generate the initramfs. When generating a kdump initramfs, \fBmkdumprd\fR
|
||||||
|
will determine how much disk space is available, if the dump target's available
|
||||||
|
space is not greater than the total system memory, \fBmkdumprd\fR will print a
|
||||||
|
warning to remind that there might not be enough space to save a vmcore. The
|
||||||
|
warning covers extreme scenarios such as the slab explodes with non-zero data or
|
||||||
|
a full vmcore, etc. Therefore, need to prevent users from having minimum disk
|
||||||
|
space for crash dump.
|
||||||
|
|
||||||
\fBmkdumprd\fR was not intended for casual use outside of the service
|
\fBmkdumprd\fR was not intended for casual use outside of the service
|
||||||
initialization script for the kdump utility, and should not be run manually. If
|
initialization script for the kdump utility, and should not be run manually. If
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
#!/bin/bash --norc
|
||||||
|
# Generate an initramfs image that isolates dump capture capability within
|
||||||
|
# the default initramfs using zz-fadumpinit dracut module.
|
||||||
|
|
||||||
|
if [ -f /etc/sysconfig/kdump ]; then
|
||||||
|
. /etc/sysconfig/kdump
|
||||||
|
fi
|
||||||
|
|
||||||
|
[[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
|
||||||
|
. $dracutbasedir/dracut-functions.sh
|
||||||
|
. /lib/kdump/kdump-lib.sh
|
||||||
|
. /lib/kdump/kdump-logger.sh
|
||||||
|
|
||||||
|
#initiate the kdump logger
|
||||||
|
if ! dlog_init; then
|
||||||
|
echo "mkfadumprd: failed to initiate the kdump logger."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
readonly MKFADUMPRD_TMPDIR="$(mktemp -d -t mkfadumprd.XXXXXX)"
|
||||||
|
[ -d "$MKFADUMPRD_TMPDIR" ] || perror_exit "mkfadumprd: mktemp -d -t mkfadumprd.XXXXXX failed."
|
||||||
|
trap '
|
||||||
|
ret=$?;
|
||||||
|
[[ -d $MKFADUMPRD_TMPDIR ]] && rm --one-file-system -rf -- "$MKFADUMPRD_TMPDIR";
|
||||||
|
exit $ret;
|
||||||
|
' EXIT
|
||||||
|
|
||||||
|
# clean up after ourselves no matter how we die.
|
||||||
|
trap 'exit 1;' SIGINT
|
||||||
|
|
||||||
|
MKDUMPRD="/sbin/mkdumprd -f"
|
||||||
|
# Default boot initramfs to be rebuilt
|
||||||
|
REBUILD_INITRD="$1" && shift
|
||||||
|
TARGET_INITRD="$1" && shift
|
||||||
|
FADUMP_INITRD="$MKFADUMPRD_TMPDIR/fadump.img"
|
||||||
|
|
||||||
|
### First build an initramfs with dump capture capability
|
||||||
|
# this file tells the initrd is fadump enabled
|
||||||
|
touch "$MKFADUMPRD_TMPDIR/fadump.initramfs"
|
||||||
|
ddebug "rebuild fadump initrd: $FADUMP_INITRD $DEFAULT_INITRD $KDUMP_KERNELVER"
|
||||||
|
if ! $MKDUMPRD "$FADUMP_INITRD" -i "$MKFADUMPRD_TMPDIR/fadump.initramfs" /etc/fadump.initramfs; then
|
||||||
|
perror_exit "mkfadumprd: failed to build image with dump capture support"
|
||||||
|
fi
|
||||||
|
|
||||||
|
### Unpack the initramfs having dump capture capability
|
||||||
|
mkdir -p "$MKFADUMPRD_TMPDIR/fadumproot"
|
||||||
|
if ! (pushd "$MKFADUMPRD_TMPDIR/fadumproot" > /dev/null && lsinitrd --unpack "$FADUMP_INITRD" && \
|
||||||
|
popd > /dev/null); then
|
||||||
|
derror "mkfadumprd: failed to unpack '$MKFADUMPRD_TMPDIR'"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
### Pack it into the normal boot initramfs with zz-fadumpinit module
|
||||||
|
_dracut_isolate_args="--rebuild $REBUILD_INITRD --add zz-fadumpinit \
|
||||||
|
-i $MKFADUMPRD_TMPDIR/fadumproot /fadumproot \
|
||||||
|
-i $MKFADUMPRD_TMPDIR/fadumproot/usr/lib/dracut/loaded-kernel-modules.txt
|
||||||
|
/usr/lib/dracut/fadump-kernel-modules.txt"
|
||||||
|
|
||||||
|
if is_squash_available; then
|
||||||
|
_dracut_isolate_args="$_dracut_isolate_args --add squash"
|
||||||
|
fi
|
||||||
|
if ! dracut --force --quiet $_dracut_isolate_args $@ "$TARGET_INITRD"; then
|
||||||
|
perror_exit "mkfadumprd: failed to setup '$TARGET_INITRD' with dump capture capability"
|
||||||
|
fi
|
|
@ -0,0 +1,88 @@
|
||||||
|
From 0f632fa180e5a44219ab6bbe0879c3583f8c65cf Mon Sep 17 00:00:00 2001
|
||||||
|
From: Pingfan Liu <piliu@redhat.com>
|
||||||
|
Date: Tue, 9 Nov 2021 11:24:22 +0800
|
||||||
|
Subject: [PATCH] RHEL-only
|
||||||
|
|
||||||
|
Cope with RHEL8 kernel
|
||||||
|
|
||||||
|
Signed-off-by: Pingfan Liu <piliu@redhat.com>
|
||||||
|
---
|
||||||
|
arch/arm64.c | 14 +++++++++++++-
|
||||||
|
makedumpfile.c | 2 ++
|
||||||
|
makedumpfile.h | 1 +
|
||||||
|
3 files changed, 16 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/makedumpfile-1.7.2/arch/arm64.c b/makedumpfile-1.7.2/arch/arm64.c
|
||||||
|
index 1072178..95beae6 100644
|
||||||
|
--- a/makedumpfile-1.7.2/arch/arm64.c
|
||||||
|
+++ b/makedumpfile-1.7.2/arch/arm64.c
|
||||||
|
@@ -50,6 +50,7 @@ static int va_bits;
|
||||||
|
static int vabits_actual;
|
||||||
|
static int flipped_va;
|
||||||
|
static unsigned long kimage_voffset;
|
||||||
|
+static int max_user_va_bits;
|
||||||
|
|
||||||
|
#define SZ_4K 4096
|
||||||
|
#define SZ_16K 16384
|
||||||
|
@@ -108,7 +109,7 @@ typedef unsigned long pgdval_t;
|
||||||
|
#define PGDIR_SHIFT ARM64_HW_PGTABLE_LEVEL_SHIFT(4 - (pgtable_level))
|
||||||
|
#define PGDIR_SIZE (_AC(1, UL) << PGDIR_SHIFT)
|
||||||
|
#define PGDIR_MASK (~(PGDIR_SIZE-1))
|
||||||
|
-#define PTRS_PER_PGD (1 << ((va_bits) - PGDIR_SHIFT))
|
||||||
|
+#define PTRS_PER_PGD (1 << ((max_user_va_bits) - PGDIR_SHIFT))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Section address mask and size definitions.
|
||||||
|
@@ -449,6 +450,17 @@ get_machdep_info_arm64(void)
|
||||||
|
ERRMSG("Can't determine platform config values\n");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
+ if (NUMBER(MAX_USER_VA_BITS) != NOT_FOUND_NUMBER) {
|
||||||
|
+ max_user_va_bits = NUMBER(MAX_USER_VA_BITS);
|
||||||
|
+ DEBUG_MSG("max_user_va_bits : %d (vmcoreinfo)\n",
|
||||||
|
+ max_user_va_bits);
|
||||||
|
+ }
|
||||||
|
+ if (!max_user_va_bits) {
|
||||||
|
+ max_user_va_bits = va_bits;
|
||||||
|
+ DEBUG_MSG("max_user_va_bits : %d (default = va_bits)\n",
|
||||||
|
+ max_user_va_bits);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
|
||||||
|
kimage_voffset = NUMBER(kimage_voffset);
|
||||||
|
info->section_size_bits = SECTIONS_SIZE_BITS;
|
||||||
|
diff --git a/makedumpfile-1.7.2/makedumpfile.c b/makedumpfile-1.7.2/makedumpfile.c
|
||||||
|
index 3ad4443..018ea4c 100644
|
||||||
|
--- a/makedumpfile-1.7.2/makedumpfile.c
|
||||||
|
+++ b/makedumpfile-1.7.2/makedumpfile.c
|
||||||
|
@@ -2417,6 +2417,7 @@ write_vmcoreinfo_data(void)
|
||||||
|
|
||||||
|
WRITE_NUMBER("HUGETLB_PAGE_DTOR", HUGETLB_PAGE_DTOR);
|
||||||
|
#ifdef __aarch64__
|
||||||
|
+ WRITE_NUMBER("MAX_USER_VA_BITS", MAX_USER_VA_BITS);
|
||||||
|
WRITE_NUMBER("VA_BITS", VA_BITS);
|
||||||
|
/* WRITE_NUMBER("TCR_EL1_T1SZ", TCR_EL1_T1SZ); should not exists */
|
||||||
|
WRITE_NUMBER_UNSIGNED("PHYS_OFFSET", PHYS_OFFSET);
|
||||||
|
@@ -2863,6 +2864,7 @@ read_vmcoreinfo(void)
|
||||||
|
READ_NUMBER("phys_base", phys_base);
|
||||||
|
READ_NUMBER("KERNEL_IMAGE_SIZE", KERNEL_IMAGE_SIZE);
|
||||||
|
#ifdef __aarch64__
|
||||||
|
+ READ_NUMBER("MAX_USER_VA_BITS", MAX_USER_VA_BITS);
|
||||||
|
READ_NUMBER("VA_BITS", VA_BITS);
|
||||||
|
READ_NUMBER("TCR_EL1_T1SZ", TCR_EL1_T1SZ);
|
||||||
|
READ_NUMBER_UNSIGNED("PHYS_OFFSET", PHYS_OFFSET);
|
||||||
|
diff --git a/makedumpfile-1.7.2/makedumpfile.h b/makedumpfile-1.7.2/makedumpfile.h
|
||||||
|
index e59239d..b6236dd 100644
|
||||||
|
--- a/makedumpfile-1.7.2/makedumpfile.h
|
||||||
|
+++ b/makedumpfile-1.7.2/makedumpfile.h
|
||||||
|
@@ -2064,6 +2064,7 @@ struct number_table {
|
||||||
|
long phys_base;
|
||||||
|
long KERNEL_IMAGE_SIZE;
|
||||||
|
#ifdef __aarch64__
|
||||||
|
+ long MAX_USER_VA_BITS;
|
||||||
|
long VA_BITS;
|
||||||
|
long TCR_EL1_T1SZ;
|
||||||
|
unsigned long PHYS_OFFSET;
|
||||||
|
--
|
||||||
|
2.31.1
|
||||||
|
|
|
@ -1,235 +0,0 @@
|
||||||
From 54d6ee9d9d4ee807de32ad490040cbb9a3055a09 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Bhupesh Sharma <bhsharma@redhat.com>
|
|
||||||
Date: Wed, 6 Feb 2019 12:31:29 +0530
|
|
||||||
Subject: [PATCH] makedumpfile/arm64: Add support for ARMv8.2-LVA (52-bit
|
|
||||||
user-space VA support)
|
|
||||||
|
|
||||||
With ARMv8.2-LVA architecture extension availability, arm64 hardware
|
|
||||||
which supports this extension can support upto 52-bit virtual
|
|
||||||
addresses. It is specially useful for having a 52-bit user-space virtual
|
|
||||||
address space while the kernel can still retain 48-bit virtual
|
|
||||||
addresses.
|
|
||||||
|
|
||||||
Since at the moment we enable the support of this extension in the
|
|
||||||
kernel via a CONFIG flag (CONFIG_ARM64_USER_VA_BITS_52), so there are
|
|
||||||
no clear mechanisms in user-space to determine this CONFIG
|
|
||||||
flag value and use it to determine the user-space VA address range
|
|
||||||
values.
|
|
||||||
|
|
||||||
'makedumpfile' can instead use 'MAX_USER_VA_BITS' value to
|
|
||||||
determine the maximum virtual physical address supported by user-space.
|
|
||||||
If 'MAX_USER_VA_BITS' value is greater than 'VA_BITS' than we are
|
|
||||||
running a use-case where user-space is 52-bit and underlying kernel is
|
|
||||||
still 48-bit. The increased 'PTRS_PER_PGD' value for such cases can then
|
|
||||||
be calculated as is done by the underlying kernel (see kernel file
|
|
||||||
'arch/arm64/include/asm/pgtable-hwdef.h' for details):
|
|
||||||
|
|
||||||
#define PTRS_PER_PGD (1 << (MAX_USER_VA_BITS - PGDIR_SHIFT))
|
|
||||||
|
|
||||||
I have sent a kernel patch upstream to add 'MAX_USER_VA_BITS' to
|
|
||||||
vmcoreinfo for arm64 (see [0]).
|
|
||||||
|
|
||||||
This patch is in accordance with ARMv8 Architecture Reference Manual
|
|
||||||
version D.a
|
|
||||||
|
|
||||||
[0].
|
|
||||||
http://lists.infradead.org/pipermail/kexec/2019-February/022411.html
|
|
||||||
|
|
||||||
Signed-off-by: Bhupesh Sharma <bhsharma@redhat.com>
|
|
||||||
---
|
|
||||||
arch/arm64.c | 109 ++++++++++++++++++++++++++++++++++++++++++---------------
|
|
||||||
makedumpfile.c | 2 ++
|
|
||||||
makedumpfile.h | 1 +
|
|
||||||
3 files changed, 83 insertions(+), 29 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/makedumpfile-1.6.5/arch/arm64.c b/makedumpfile-1.6.5/arch/arm64.c
|
|
||||||
index 053519359cbc..5fcf59d36fed 100644
|
|
||||||
--- a/makedumpfile-1.6.5/arch/arm64.c
|
|
||||||
+++ b/makedumpfile-1.6.5/arch/arm64.c
|
|
||||||
@@ -41,6 +41,7 @@ typedef struct {
|
|
||||||
|
|
||||||
static int pgtable_level;
|
|
||||||
static int va_bits;
|
|
||||||
+static int max_user_va_bits;
|
|
||||||
static unsigned long kimage_voffset;
|
|
||||||
|
|
||||||
#define SZ_4K (4 * 1024)
|
|
||||||
@@ -61,7 +62,7 @@ static unsigned long kimage_voffset;
|
|
||||||
|
|
||||||
#define PAGE_MASK (~(PAGESIZE() - 1))
|
|
||||||
#define PGDIR_SHIFT ((PAGESHIFT() - 3) * pgtable_level + 3)
|
|
||||||
-#define PTRS_PER_PGD (1 << (va_bits - PGDIR_SHIFT))
|
|
||||||
+#define PTRS_PER_PGD (1 << ((max_user_va_bits) - PGDIR_SHIFT))
|
|
||||||
#define PUD_SHIFT get_pud_shift_arm64()
|
|
||||||
#define PUD_SIZE (1UL << PUD_SHIFT)
|
|
||||||
#define PUD_MASK (~(PUD_SIZE - 1))
|
|
||||||
@@ -73,6 +74,10 @@ static unsigned long kimage_voffset;
|
|
||||||
#define PTRS_PER_PMD PTRS_PER_PTE
|
|
||||||
|
|
||||||
#define PAGE_PRESENT (1 << 0)
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ * Section address mask and size definitions.
|
|
||||||
+ */
|
|
||||||
#define SECTIONS_SIZE_BITS 30
|
|
||||||
/* Highest possible physical address supported */
|
|
||||||
#define PHYS_MASK_SHIFT 48
|
|
||||||
@@ -284,14 +289,83 @@ get_stext_symbol(void)
|
|
||||||
return(found ? kallsym : FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
+static int
|
|
||||||
+get_va_bits_from_stext_arm64(void)
|
|
||||||
+{
|
|
||||||
+ ulong _stext;
|
|
||||||
+
|
|
||||||
+ _stext = get_stext_symbol();
|
|
||||||
+ if (!_stext) {
|
|
||||||
+ ERRMSG("Can't get the symbol of _stext.\n");
|
|
||||||
+ return FALSE;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /* Derive va_bits as per arch/arm64/Kconfig */
|
|
||||||
+ if ((_stext & PAGE_OFFSET_36) == PAGE_OFFSET_36) {
|
|
||||||
+ va_bits = 36;
|
|
||||||
+ } else if ((_stext & PAGE_OFFSET_39) == PAGE_OFFSET_39) {
|
|
||||||
+ va_bits = 39;
|
|
||||||
+ } else if ((_stext & PAGE_OFFSET_42) == PAGE_OFFSET_42) {
|
|
||||||
+ va_bits = 42;
|
|
||||||
+ } else if ((_stext & PAGE_OFFSET_47) == PAGE_OFFSET_47) {
|
|
||||||
+ va_bits = 47;
|
|
||||||
+ } else if ((_stext & PAGE_OFFSET_48) == PAGE_OFFSET_48) {
|
|
||||||
+ va_bits = 48;
|
|
||||||
+ } else {
|
|
||||||
+ ERRMSG("Cannot find a proper _stext for calculating VA_BITS\n");
|
|
||||||
+ return FALSE;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ DEBUG_MSG("va_bits : %d\n", va_bits);
|
|
||||||
+
|
|
||||||
+ return TRUE;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void
|
|
||||||
+get_page_offset_arm64(void)
|
|
||||||
+{
|
|
||||||
+ info->page_offset = (0xffffffffffffffffUL) << (va_bits - 1);
|
|
||||||
+
|
|
||||||
+ DEBUG_MSG("page_offset : %lx\n", info->page_offset);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
int
|
|
||||||
get_machdep_info_arm64(void)
|
|
||||||
{
|
|
||||||
/* Check if va_bits is still not initialized. If still 0, call
|
|
||||||
* get_versiondep_info() to initialize the same.
|
|
||||||
*/
|
|
||||||
+ if (NUMBER(VA_BITS) != NOT_FOUND_NUMBER) {
|
|
||||||
+ va_bits = NUMBER(VA_BITS);
|
|
||||||
+ DEBUG_MSG("va_bits : %d (vmcoreinfo)\n",
|
|
||||||
+ va_bits);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /* Check if va_bits is still not initialized. If still 0, call
|
|
||||||
+ * get_versiondep_info() to initialize the same from _stext
|
|
||||||
+ * symbol.
|
|
||||||
+ */
|
|
||||||
if (!va_bits)
|
|
||||||
- get_versiondep_info_arm64();
|
|
||||||
+ if (get_va_bits_from_stext_arm64() == ERROR)
|
|
||||||
+ return ERROR;
|
|
||||||
+
|
|
||||||
+ get_page_offset_arm64();
|
|
||||||
+
|
|
||||||
+ if (NUMBER(MAX_USER_VA_BITS) != NOT_FOUND_NUMBER) {
|
|
||||||
+ max_user_va_bits = NUMBER(MAX_USER_VA_BITS);
|
|
||||||
+ DEBUG_MSG("max_user_va_bits : %d (vmcoreinfo)\n",
|
|
||||||
+ max_user_va_bits);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /* Check if max_user_va_bits is still not initialized.
|
|
||||||
+ * If still 0, its not available in vmcoreinfo and its
|
|
||||||
+ * safe to initialize it with va_bits.
|
|
||||||
+ */
|
|
||||||
+ if (!max_user_va_bits) {
|
|
||||||
+ max_user_va_bits = va_bits;
|
|
||||||
+ DEBUG_MSG("max_user_va_bits : %d (default = va_bits)\n",
|
|
||||||
+ max_user_va_bits);
|
|
||||||
+ }
|
|
||||||
|
|
||||||
if (!calculate_plat_config()) {
|
|
||||||
ERRMSG("Can't determine platform config values\n");
|
|
||||||
@@ -330,34 +404,11 @@ get_xen_info_arm64(void)
|
|
||||||
int
|
|
||||||
get_versiondep_info_arm64(void)
|
|
||||||
{
|
|
||||||
- ulong _stext;
|
|
||||||
-
|
|
||||||
- _stext = get_stext_symbol();
|
|
||||||
- if (!_stext) {
|
|
||||||
- ERRMSG("Can't get the symbol of _stext.\n");
|
|
||||||
- return FALSE;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- /* Derive va_bits as per arch/arm64/Kconfig */
|
|
||||||
- if ((_stext & PAGE_OFFSET_36) == PAGE_OFFSET_36) {
|
|
||||||
- va_bits = 36;
|
|
||||||
- } else if ((_stext & PAGE_OFFSET_39) == PAGE_OFFSET_39) {
|
|
||||||
- va_bits = 39;
|
|
||||||
- } else if ((_stext & PAGE_OFFSET_42) == PAGE_OFFSET_42) {
|
|
||||||
- va_bits = 42;
|
|
||||||
- } else if ((_stext & PAGE_OFFSET_47) == PAGE_OFFSET_47) {
|
|
||||||
- va_bits = 47;
|
|
||||||
- } else if ((_stext & PAGE_OFFSET_48) == PAGE_OFFSET_48) {
|
|
||||||
- va_bits = 48;
|
|
||||||
- } else {
|
|
||||||
- ERRMSG("Cannot find a proper _stext for calculating VA_BITS\n");
|
|
||||||
- return FALSE;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- info->page_offset = (0xffffffffffffffffUL) << (va_bits - 1);
|
|
||||||
+ if (!va_bits)
|
|
||||||
+ if (get_va_bits_from_stext_arm64() == ERROR)
|
|
||||||
+ return ERROR;
|
|
||||||
|
|
||||||
- DEBUG_MSG("va_bits : %d\n", va_bits);
|
|
||||||
- DEBUG_MSG("page_offset : %lx\n", info->page_offset);
|
|
||||||
+ get_page_offset_arm64();
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
diff --git a/makedumpfile-1.6.5/makedumpfile.c b/makedumpfile-1.6.5/makedumpfile.c
|
|
||||||
index 590f759c84f1..b9085247375e 100644
|
|
||||||
--- a/makedumpfile-1.6.5/makedumpfile.c
|
|
||||||
+++ b/makedumpfile-1.6.5/makedumpfile.c
|
|
||||||
@@ -2312,6 +2312,7 @@ write_vmcoreinfo_data(void)
|
|
||||||
|
|
||||||
WRITE_NUMBER("HUGETLB_PAGE_DTOR", HUGETLB_PAGE_DTOR);
|
|
||||||
#ifdef __aarch64__
|
|
||||||
+ WRITE_NUMBER("MAX_USER_VA_BITS", MAX_USER_VA_BITS);
|
|
||||||
WRITE_NUMBER("VA_BITS", VA_BITS);
|
|
||||||
WRITE_NUMBER_UNSIGNED("PHYS_OFFSET", PHYS_OFFSET);
|
|
||||||
WRITE_NUMBER_UNSIGNED("kimage_voffset", kimage_voffset);
|
|
||||||
@@ -2717,6 +2718,7 @@ read_vmcoreinfo(void)
|
|
||||||
READ_NUMBER("PAGE_OFFLINE_MAPCOUNT_VALUE", PAGE_OFFLINE_MAPCOUNT_VALUE);
|
|
||||||
READ_NUMBER("phys_base", phys_base);
|
|
||||||
#ifdef __aarch64__
|
|
||||||
+ READ_NUMBER("MAX_USER_VA_BITS", MAX_USER_VA_BITS);
|
|
||||||
READ_NUMBER("VA_BITS", VA_BITS);
|
|
||||||
READ_NUMBER_UNSIGNED("PHYS_OFFSET", PHYS_OFFSET);
|
|
||||||
READ_NUMBER_UNSIGNED("kimage_voffset", kimage_voffset);
|
|
||||||
diff --git a/makedumpfile-1.6.5/makedumpfile.h b/makedumpfile-1.6.5/makedumpfile.h
|
|
||||||
index 5ad38e9ae40c..311ac05a28ab 100644
|
|
||||||
--- a/makedumpfile-1.6.5/makedumpfile.h
|
|
||||||
+++ b/makedumpfile-1.6.5/makedumpfile.h
|
|
||||||
@@ -1935,6 +1935,7 @@ struct number_table {
|
|
||||||
long HUGETLB_PAGE_DTOR;
|
|
||||||
long phys_base;
|
|
||||||
#ifdef __aarch64__
|
|
||||||
+ long MAX_USER_VA_BITS;
|
|
||||||
long VA_BITS;
|
|
||||||
unsigned long PHYS_OFFSET;
|
|
||||||
unsigned long kimage_voffset;
|
|
||||||
--
|
|
||||||
2.7.4
|
|
||||||
|
|
|
@ -35,13 +35,17 @@ updating lists accordingly.
|
||||||
Supported Dump targets
|
Supported Dump targets
|
||||||
----------------------
|
----------------------
|
||||||
storage:
|
storage:
|
||||||
LVM volume (no thinp)
|
LVM volume
|
||||||
|
Thin provisioning volume
|
||||||
FC disks (qla2xxx, lpfc, bnx2fc, bfa)
|
FC disks (qla2xxx, lpfc, bnx2fc, bfa)
|
||||||
software initiator based iSCSI
|
software initiator based iSCSI
|
||||||
software RAID (mdraid)
|
software RAID (mdraid)
|
||||||
hardware RAID (cciss, hpsa, megaraid_sas, mpt2sas, aacraid)
|
hardware RAID (cciss, hpsa, megaraid_sas, mpt2sas, aacraid)
|
||||||
SCSI/SATA disks
|
SCSI/SATA disks
|
||||||
iSCSI HBA (all offload)
|
iSCSI HBA (all offload)
|
||||||
|
hardware FCoE (qla2xxx, lpfc)
|
||||||
|
software FCoE (bnx2fc) (Extra configuration required,
|
||||||
|
please read "Note on FCoE" section below)
|
||||||
|
|
||||||
network:
|
network:
|
||||||
Hardware using kernel modules: (tg3, igb, ixgbe, sfc, e1000e, bna,
|
Hardware using kernel modules: (tg3, igb, ixgbe, sfc, e1000e, bna,
|
||||||
|
@ -76,7 +80,6 @@ Unsupported Dump targets
|
||||||
------------------------
|
------------------------
|
||||||
storage:
|
storage:
|
||||||
BIOS RAID
|
BIOS RAID
|
||||||
Thin provisioning volume
|
|
||||||
Software iSCSI with iBFT (bnx2i, cxgb3i, cxgb4i)
|
Software iSCSI with iBFT (bnx2i, cxgb3i, cxgb4i)
|
||||||
Software iSCSI with hybrid (be2iscsi)
|
Software iSCSI with hybrid (be2iscsi)
|
||||||
FCoE
|
FCoE
|
||||||
|
@ -104,6 +107,21 @@ hypervisor:
|
||||||
Hyper-V 2012
|
Hyper-V 2012
|
||||||
|
|
||||||
|
|
||||||
|
Note on FCoE
|
||||||
|
=====================
|
||||||
|
If you are trying to dump to a software FCoE target, you may encounter OOM
|
||||||
|
issue, because some software FCoE requires more memory to work. In such case,
|
||||||
|
you may need to increase the kdump reserved memory size in "crashkernel="
|
||||||
|
kernel parameter.
|
||||||
|
|
||||||
|
By default, RHEL systems have "crashkernel=auto" in kernel boot arguments.
|
||||||
|
The auto reserved memory size is designed to balance the coverage of use cases
|
||||||
|
and an acceptable memory overhead, so not every use case could fit in, software
|
||||||
|
FCoE is one of the case.
|
||||||
|
|
||||||
|
For hardware FCoE, kdump should work naturally as firmware will do the
|
||||||
|
initialization job. The capture kernel and kdump tools will run just fine.
|
||||||
|
|
||||||
Useful Links
|
Useful Links
|
||||||
============
|
============
|
||||||
[1] RHEL6: Enabling kdump for full-virt (HVM) Xen DomU
|
[1] RHEL6: Enabling kdump for full-virt (HVM) Xen DomU
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
Name: kexec-tools
|
Name: kexec-tools
|
||||||
Version: 2.0.19
|
Version: 2.0.26
|
||||||
Release: 7%{?dist}
|
Release: 14%{?dist}
|
||||||
License: GPLv2
|
License: GPLv2
|
||||||
Group: Applications/System
|
Group: Applications/System
|
||||||
Summary: The kexec/kdump userspace component
|
Summary: The kexec/kdump userspace component
|
||||||
|
@ -12,8 +12,8 @@ Source3: kdump.sysconfig.x86_64
|
||||||
Source4: kdump.sysconfig.i386
|
Source4: kdump.sysconfig.i386
|
||||||
Source5: kdump.sysconfig.ppc64
|
Source5: kdump.sysconfig.ppc64
|
||||||
Source7: mkdumprd
|
Source7: mkdumprd
|
||||||
Source8: kdump.conf
|
Source8: gen-kdump-conf.sh
|
||||||
Source9: http://downloads.sourceforge.net/project/makedumpfile/makedumpfile/1.6.5/makedumpfile-1.6.5.tar.gz
|
Source9: https://github.com/makedumpfile/makedumpfile/archive/1.7.2.tar.gz
|
||||||
Source10: kexec-kdump-howto.txt
|
Source10: kexec-kdump-howto.txt
|
||||||
Source12: mkdumprd.8
|
Source12: mkdumprd.8
|
||||||
Source13: 98-kexec.rules
|
Source13: 98-kexec.rules
|
||||||
|
@ -33,6 +33,12 @@ Source27: early-kdump-howto.txt
|
||||||
Source28: supported-kdump-targets.txt
|
Source28: supported-kdump-targets.txt
|
||||||
Source29: kdump-udev-throttler
|
Source29: kdump-udev-throttler
|
||||||
Source30: kdump.sysconfig.aarch64
|
Source30: kdump.sysconfig.aarch64
|
||||||
|
Source31: fadump-howto.txt
|
||||||
|
Source32: 60-kdump.install
|
||||||
|
Source33: kdump-logger.sh
|
||||||
|
Source34: kdump-migrate-action.sh
|
||||||
|
Source35: kdump-restart.sh
|
||||||
|
Source36: mkfadumprd
|
||||||
|
|
||||||
#######################################
|
#######################################
|
||||||
# These are sources for mkdumpramfs
|
# These are sources for mkdumpramfs
|
||||||
|
@ -49,15 +55,23 @@ Source107: dracut-kdump-emergency.target
|
||||||
Source108: dracut-early-kdump.sh
|
Source108: dracut-early-kdump.sh
|
||||||
Source109: dracut-early-kdump-module-setup.sh
|
Source109: dracut-early-kdump-module-setup.sh
|
||||||
|
|
||||||
|
Source200: dracut-fadump-init-fadump.sh
|
||||||
|
Source201: dracut-fadump-module-setup.sh
|
||||||
|
|
||||||
|
%ifarch ppc64 ppc64le
|
||||||
|
Requires(post): servicelog
|
||||||
|
Recommends: keyutils
|
||||||
|
%endif
|
||||||
|
|
||||||
Requires(post): systemd-units
|
Requires(post): systemd-units
|
||||||
Requires(preun): systemd-units
|
Requires(preun): systemd-units
|
||||||
Requires(postun): systemd-units
|
Requires(postun): systemd-units
|
||||||
Requires(pre): coreutils sed zlib
|
Requires(pre): coreutils sed zlib
|
||||||
Requires: dracut >= 049
|
Requires: dracut >= 049-129
|
||||||
Requires: dracut-network >= 049
|
Requires: dracut-network >= 049
|
||||||
Requires: dracut-squash >= 049
|
Requires: dracut-squash >= 049
|
||||||
Requires: ethtool
|
Requires: ethtool
|
||||||
BuildRequires: zlib-devel zlib zlib-static elfutils-devel-static glib2-devel bzip2-devel ncurses-devel bison flex lzo-devel snappy-devel
|
BuildRequires: zlib-devel zlib zlib-static elfutils-devel glib2-devel bzip2-devel ncurses-devel bison flex lzo-devel snappy-devel libzstd-devel
|
||||||
BuildRequires: pkgconfig intltool gettext
|
BuildRequires: pkgconfig intltool gettext
|
||||||
BuildRequires: systemd-units
|
BuildRequires: systemd-units
|
||||||
BuildRequires: automake autoconf libtool
|
BuildRequires: automake autoconf libtool
|
||||||
|
@ -65,6 +79,8 @@ BuildRequires: automake autoconf libtool
|
||||||
Obsoletes: diskdumputils netdump kexec-tools-eppic
|
Obsoletes: diskdumputils netdump kexec-tools-eppic
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
|
ExcludeArch: i686
|
||||||
|
|
||||||
#START INSERT
|
#START INSERT
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -74,8 +90,7 @@ Obsoletes: diskdumputils netdump kexec-tools-eppic
|
||||||
#
|
#
|
||||||
# Patches 101 through 200 are meant for x86_64 kexec-tools enablement
|
# Patches 101 through 200 are meant for x86_64 kexec-tools enablement
|
||||||
#
|
#
|
||||||
Patch101: kexec-tools-2.0.19-x86-Introduce-a-new-option-reuse-video-type.patch
|
|
||||||
Patch102: kexec-tools-2.0.19-makedumpfiles-x86_64-Add-support-for-AMD-Secure-Memory-Encry.patch
|
|
||||||
#
|
#
|
||||||
# Patches 301 through 400 are meant for ppc64 kexec-tools enablement
|
# Patches 301 through 400 are meant for ppc64 kexec-tools enablement
|
||||||
#
|
#
|
||||||
|
@ -83,6 +98,7 @@ Patch102: kexec-tools-2.0.19-makedumpfiles-x86_64-Add-support-for-AMD-Secure-Mem
|
||||||
#
|
#
|
||||||
# Patches 401 through 500 are meant for s390 kexec-tools enablement
|
# Patches 401 through 500 are meant for s390 kexec-tools enablement
|
||||||
#
|
#
|
||||||
|
|
||||||
#
|
#
|
||||||
# Patches 501 through 600 are meant for ARM kexec-tools enablement
|
# Patches 501 through 600 are meant for ARM kexec-tools enablement
|
||||||
#
|
#
|
||||||
|
@ -90,16 +106,17 @@ Patch102: kexec-tools-2.0.19-makedumpfiles-x86_64-Add-support-for-AMD-Secure-Mem
|
||||||
#
|
#
|
||||||
# Patches 601 onward are generic patches
|
# Patches 601 onward are generic patches
|
||||||
#
|
#
|
||||||
Patch601: kexec-tools-2.0.16-koji-build-fail-workaround.patch
|
Patch601: rhelonly-kexec-tools-2.0.16-koji-build-fail-workaround.patch
|
||||||
Patch603: kexec-tools-2.0.18-makedumpfiles-honor-the-CFLAGS-from-environment.patch
|
Patch602: rhelonly-kexec-tools-2.0.18-eppic-fix-issues-with-hardening-flags.patch
|
||||||
Patch604: kexec-tools-2.0.18-eppic-fix-issues-with-hardening-flags.patch
|
|
||||||
Patch605: kexec-tools-2.0.18-makedumpfiles-exclude-pages-that-are-logically-offline.patch
|
# Patches 701 onward for makedumpfile
|
||||||
Patch606: rhonly-kexec-tools-2.0.18-makedumpfile-arm64-Add-support-for-ARMv8.2-LVA-52-bi.patch
|
Patch701: rhelonly-kexec-tools-2.0.20-makedumpfile-arm64-Add-support-for-ARMv8.2-LVA-52-bi.patch
|
||||||
|
Patch702: kexec-tools-2.0.26-makedumpfile-sadump-fix-failure-of-reading-memory-when-5-le.patch
|
||||||
|
|
||||||
%description
|
%description
|
||||||
kexec-tools provides /sbin/kexec binary that facilitates a new
|
kexec-tools provides /usr/sbin/kexec binary that facilitates a new
|
||||||
kernel to boot using the kernel's kexec feature either on a
|
kernel to boot using the kernel's kexec feature either on a
|
||||||
normal or a panic reboot. This package contains the /sbin/kexec
|
normal or a panic reboot. This package contains the /usr/sbin/kexec
|
||||||
binary and ancillary utilities that together form the userspace
|
binary and ancillary utilities that together form the userspace
|
||||||
component of the kernel's kexec feature.
|
component of the kernel's kexec feature.
|
||||||
|
|
||||||
|
@ -110,13 +127,11 @@ mkdir -p -m755 kcp
|
||||||
tar -z -x -v -f %{SOURCE9}
|
tar -z -x -v -f %{SOURCE9}
|
||||||
tar -z -x -v -f %{SOURCE19}
|
tar -z -x -v -f %{SOURCE19}
|
||||||
|
|
||||||
%patch101 -p1
|
|
||||||
%patch601 -p1
|
%patch601 -p1
|
||||||
%patch603 -p1
|
%patch602 -p1
|
||||||
%patch604 -p1
|
|
||||||
%patch605 -p1
|
%patch701 -p1
|
||||||
%patch606 -p1
|
%patch702 -p1
|
||||||
%patch102 -p1
|
|
||||||
|
|
||||||
%ifarch ppc
|
%ifarch ppc
|
||||||
%define archdef ARCH=ppc
|
%define archdef ARCH=ppc
|
||||||
|
@ -133,7 +148,7 @@ autoreconf
|
||||||
--host=powerpc64le-redhat-linux-gnu \
|
--host=powerpc64le-redhat-linux-gnu \
|
||||||
--build=powerpc64le-redhat-linux-gnu \
|
--build=powerpc64le-redhat-linux-gnu \
|
||||||
%endif
|
%endif
|
||||||
--sbindir=/sbin
|
--sbindir=/usr/sbin
|
||||||
rm -f kexec-tools.spec.in
|
rm -f kexec-tools.spec.in
|
||||||
# setup the docs
|
# setup the docs
|
||||||
cp %{SOURCE10} .
|
cp %{SOURCE10} .
|
||||||
|
@ -141,17 +156,24 @@ cp %{SOURCE21} .
|
||||||
cp %{SOURCE26} .
|
cp %{SOURCE26} .
|
||||||
cp %{SOURCE27} .
|
cp %{SOURCE27} .
|
||||||
cp %{SOURCE28} .
|
cp %{SOURCE28} .
|
||||||
|
cp %{SOURCE31} .
|
||||||
|
|
||||||
|
# Generate sysconfig file
|
||||||
|
%{SOURCE8} %{_target_cpu} > kdump.conf
|
||||||
|
|
||||||
make
|
make
|
||||||
%ifarch %{ix86} x86_64 ppc64 s390x ppc64le aarch64
|
%ifarch %{ix86} x86_64 ppc64 s390x ppc64le aarch64
|
||||||
make -C eppic/libeppic
|
make -C eppic/libeppic
|
||||||
make -C makedumpfile-1.6.5 LINKTYPE=dynamic USELZO=on USESNAPPY=on
|
make -C makedumpfile-1.7.2 LINKTYPE=dynamic USELZO=on USESNAPPY=on USEZSTD=on
|
||||||
make -C makedumpfile-1.6.5 LDFLAGS="$LDFLAGS -I../eppic/libeppic -L../eppic/libeppic" eppic_makedumpfile.so
|
make -C makedumpfile-1.7.2 LDFLAGS="$LDFLAGS -I../eppic/libeppic -L../eppic/libeppic" eppic_makedumpfile.so
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
%install
|
%install
|
||||||
mkdir -p -m755 $RPM_BUILD_ROOT/sbin
|
mkdir -p -m755 $RPM_BUILD_ROOT/usr/sbin
|
||||||
mkdir -p -m755 $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig
|
mkdir -p -m755 $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig
|
||||||
|
mkdir -p -m755 $RPM_BUILD_ROOT%{_sysconfdir}/kdump
|
||||||
|
mkdir -p -m755 $RPM_BUILD_ROOT%{_sysconfdir}/kdump/pre.d
|
||||||
|
mkdir -p -m755 $RPM_BUILD_ROOT%{_sysconfdir}/kdump/post.d
|
||||||
mkdir -p -m755 $RPM_BUILD_ROOT%{_localstatedir}/crash
|
mkdir -p -m755 $RPM_BUILD_ROOT%{_localstatedir}/crash
|
||||||
mkdir -p -m755 $RPM_BUILD_ROOT%{_mandir}/man8/
|
mkdir -p -m755 $RPM_BUILD_ROOT%{_mandir}/man8/
|
||||||
mkdir -p -m755 $RPM_BUILD_ROOT%{_mandir}/man5/
|
mkdir -p -m755 $RPM_BUILD_ROOT%{_mandir}/man5/
|
||||||
|
@ -162,10 +184,11 @@ mkdir -p $RPM_BUILD_ROOT%{_unitdir}
|
||||||
mkdir -p -m755 $RPM_BUILD_ROOT%{_bindir}
|
mkdir -p -m755 $RPM_BUILD_ROOT%{_bindir}
|
||||||
mkdir -p -m755 $RPM_BUILD_ROOT%{_libdir}
|
mkdir -p -m755 $RPM_BUILD_ROOT%{_libdir}
|
||||||
mkdir -p -m755 $RPM_BUILD_ROOT%{_prefix}/lib/kdump
|
mkdir -p -m755 $RPM_BUILD_ROOT%{_prefix}/lib/kdump
|
||||||
|
mkdir -p -m755 $RPM_BUILD_ROOT%{_sharedstatedir}/kdump
|
||||||
install -m 755 %{SOURCE1} $RPM_BUILD_ROOT%{_bindir}/kdumpctl
|
install -m 755 %{SOURCE1} $RPM_BUILD_ROOT%{_bindir}/kdumpctl
|
||||||
|
|
||||||
install -m 755 build/sbin/kexec $RPM_BUILD_ROOT/sbin/kexec
|
install -m 755 build/sbin/kexec $RPM_BUILD_ROOT/usr/sbin/kexec
|
||||||
install -m 755 build/sbin/vmcore-dmesg $RPM_BUILD_ROOT/sbin/vmcore-dmesg
|
install -m 755 build/sbin/vmcore-dmesg $RPM_BUILD_ROOT/usr/sbin/vmcore-dmesg
|
||||||
install -m 644 build/man/man8/kexec.8 $RPM_BUILD_ROOT%{_mandir}/man8/
|
install -m 644 build/man/man8/kexec.8 $RPM_BUILD_ROOT%{_mandir}/man8/
|
||||||
install -m 644 build/man/man8/vmcore-dmesg.8 $RPM_BUILD_ROOT%{_mandir}/man8/
|
install -m 644 build/man/man8/vmcore-dmesg.8 $RPM_BUILD_ROOT%{_mandir}/man8/
|
||||||
|
|
||||||
|
@ -174,13 +197,15 @@ SYSCONFIG=$RPM_SOURCE_DIR/kdump.sysconfig.%{_target_cpu}
|
||||||
[ -f $SYSCONFIG ] || SYSCONFIG=$RPM_SOURCE_DIR/kdump.sysconfig
|
[ -f $SYSCONFIG ] || SYSCONFIG=$RPM_SOURCE_DIR/kdump.sysconfig
|
||||||
install -m 644 $SYSCONFIG $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/kdump
|
install -m 644 $SYSCONFIG $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/kdump
|
||||||
|
|
||||||
install -m 755 %{SOURCE7} $RPM_BUILD_ROOT/sbin/mkdumprd
|
install -m 755 %{SOURCE7} $RPM_BUILD_ROOT/usr/sbin/mkdumprd
|
||||||
install -m 644 %{SOURCE8} $RPM_BUILD_ROOT%{_sysconfdir}/kdump.conf
|
install -m 755 %{SOURCE36} $RPM_BUILD_ROOT/usr/sbin/mkfadumprd
|
||||||
|
install -m 644 kdump.conf $RPM_BUILD_ROOT%{_sysconfdir}/kdump.conf
|
||||||
install -m 644 kexec/kexec.8 $RPM_BUILD_ROOT%{_mandir}/man8/kexec.8
|
install -m 644 kexec/kexec.8 $RPM_BUILD_ROOT%{_mandir}/man8/kexec.8
|
||||||
install -m 644 %{SOURCE12} $RPM_BUILD_ROOT%{_mandir}/man8/mkdumprd.8
|
install -m 644 %{SOURCE12} $RPM_BUILD_ROOT%{_mandir}/man8/mkdumprd.8
|
||||||
install -m 644 %{SOURCE25} $RPM_BUILD_ROOT%{_mandir}/man8/kdumpctl.8
|
install -m 644 %{SOURCE25} $RPM_BUILD_ROOT%{_mandir}/man8/kdumpctl.8
|
||||||
install -m 755 %{SOURCE20} $RPM_BUILD_ROOT%{_prefix}/lib/kdump/kdump-lib.sh
|
install -m 755 %{SOURCE20} $RPM_BUILD_ROOT%{_prefix}/lib/kdump/kdump-lib.sh
|
||||||
install -m 755 %{SOURCE23} $RPM_BUILD_ROOT%{_prefix}/lib/kdump/kdump-lib-initramfs.sh
|
install -m 755 %{SOURCE23} $RPM_BUILD_ROOT%{_prefix}/lib/kdump/kdump-lib-initramfs.sh
|
||||||
|
install -m 755 %{SOURCE33} $RPM_BUILD_ROOT%{_prefix}/lib/kdump/kdump-logger.sh
|
||||||
%ifnarch s390x ppc64 ppc64le
|
%ifnarch s390x ppc64 ppc64le
|
||||||
# For s390x the ELF header is created in the kdump kernel and therefore kexec
|
# For s390x the ELF header is created in the kdump kernel and therefore kexec
|
||||||
# udev rules are not required
|
# udev rules are not required
|
||||||
|
@ -188,6 +213,8 @@ install -m 644 %{SOURCE13} $RPM_BUILD_ROOT%{_udevrulesdir}/98-kexec.rules
|
||||||
%endif
|
%endif
|
||||||
%ifarch ppc64 ppc64le
|
%ifarch ppc64 ppc64le
|
||||||
install -m 644 %{SOURCE14} $RPM_BUILD_ROOT%{_udevrulesdir}/98-kexec.rules
|
install -m 644 %{SOURCE14} $RPM_BUILD_ROOT%{_udevrulesdir}/98-kexec.rules
|
||||||
|
install -m 755 %{SOURCE34} $RPM_BUILD_ROOT%{_prefix}/lib/kdump/kdump-migrate-action.sh
|
||||||
|
install -m 755 %{SOURCE35} $RPM_BUILD_ROOT%{_prefix}/lib/kdump/kdump-restart.sh
|
||||||
%endif
|
%endif
|
||||||
%ifnarch s390x
|
%ifnarch s390x
|
||||||
install -m 755 %{SOURCE29} $RPM_BUILD_ROOT%{_udevrulesdir}/../kdump-udev-throttler
|
install -m 755 %{SOURCE29} $RPM_BUILD_ROOT%{_udevrulesdir}/../kdump-udev-throttler
|
||||||
|
@ -195,19 +222,22 @@ install -m 755 %{SOURCE29} $RPM_BUILD_ROOT%{_udevrulesdir}/../kdump-udev-throttl
|
||||||
install -m 644 %{SOURCE15} $RPM_BUILD_ROOT%{_mandir}/man5/kdump.conf.5
|
install -m 644 %{SOURCE15} $RPM_BUILD_ROOT%{_mandir}/man5/kdump.conf.5
|
||||||
install -m 644 %{SOURCE16} $RPM_BUILD_ROOT%{_unitdir}/kdump.service
|
install -m 644 %{SOURCE16} $RPM_BUILD_ROOT%{_unitdir}/kdump.service
|
||||||
install -m 755 -D %{SOURCE22} $RPM_BUILD_ROOT%{_prefix}/lib/systemd/system-generators/kdump-dep-generator.sh
|
install -m 755 -D %{SOURCE22} $RPM_BUILD_ROOT%{_prefix}/lib/systemd/system-generators/kdump-dep-generator.sh
|
||||||
|
install -m 755 -D %{SOURCE32} $RPM_BUILD_ROOT%{_prefix}/lib/kernel/install.d/60-kdump.install
|
||||||
|
|
||||||
|
|
||||||
%ifarch %{ix86} x86_64 ppc64 s390x ppc64le aarch64
|
%ifarch %{ix86} x86_64 ppc64 s390x ppc64le aarch64
|
||||||
install -m 755 makedumpfile-1.6.5/makedumpfile $RPM_BUILD_ROOT/sbin/makedumpfile
|
install -m 755 makedumpfile-1.7.2/makedumpfile $RPM_BUILD_ROOT/usr/sbin/makedumpfile
|
||||||
install -m 644 makedumpfile-1.6.5/makedumpfile.8.gz $RPM_BUILD_ROOT/%{_mandir}/man8/makedumpfile.8.gz
|
install -m 644 makedumpfile-1.7.2/makedumpfile.8 $RPM_BUILD_ROOT/%{_mandir}/man8/makedumpfile.8
|
||||||
install -m 644 makedumpfile-1.6.5/makedumpfile.conf.5.gz $RPM_BUILD_ROOT/%{_mandir}/man5/makedumpfile.conf.5.gz
|
install -m 644 makedumpfile-1.7.2/makedumpfile.conf.5 $RPM_BUILD_ROOT/%{_mandir}/man5/makedumpfile.conf.5
|
||||||
install -m 644 makedumpfile-1.6.5/makedumpfile.conf $RPM_BUILD_ROOT/%{_sysconfdir}/makedumpfile.conf.sample
|
install -m 644 makedumpfile-1.7.2/makedumpfile.conf $RPM_BUILD_ROOT/%{_sysconfdir}/makedumpfile.conf.sample
|
||||||
install -m 755 makedumpfile-1.6.5/eppic_makedumpfile.so $RPM_BUILD_ROOT/%{_libdir}/eppic_makedumpfile.so
|
install -m 755 makedumpfile-1.7.2/eppic_makedumpfile.so $RPM_BUILD_ROOT/%{_libdir}/eppic_makedumpfile.so
|
||||||
mkdir -p $RPM_BUILD_ROOT/usr/share/makedumpfile/eppic_scripts/
|
mkdir -p $RPM_BUILD_ROOT/usr/share/makedumpfile/eppic_scripts/
|
||||||
install -m 644 makedumpfile-1.6.5/eppic_scripts/* $RPM_BUILD_ROOT/usr/share/makedumpfile/eppic_scripts/
|
install -m 644 makedumpfile-1.7.2/eppic_scripts/* $RPM_BUILD_ROOT/usr/share/makedumpfile/eppic_scripts/
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
%define remove_dracut_prefix() %(echo -n %1|sed 's/.*dracut-//g')
|
%define remove_dracut_prefix() %(echo -n %1|sed 's/.*dracut-//g')
|
||||||
%define remove_dracut_early_kdump_prefix() %(echo -n %1|sed 's/.*dracut-early-kdump-//g')
|
%define remove_dracut_early_kdump_prefix() %(echo -n %1|sed 's/.*dracut-early-kdump-//g')
|
||||||
|
%define remove_dracut_fadump_prefix() %(echo -n %1|sed 's/.*dracut-fadump-//g')
|
||||||
|
|
||||||
# deal with dracut modules
|
# deal with dracut modules
|
||||||
mkdir -p -m755 $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpbase
|
mkdir -p -m755 $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpbase
|
||||||
|
@ -226,6 +256,13 @@ cp %{SOURCE108} $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99earlyk
|
||||||
cp %{SOURCE109} $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99earlykdump/%{remove_dracut_early_kdump_prefix %{SOURCE109}}
|
cp %{SOURCE109} $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99earlykdump/%{remove_dracut_early_kdump_prefix %{SOURCE109}}
|
||||||
chmod 755 $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99earlykdump/%{remove_dracut_prefix %{SOURCE108}}
|
chmod 755 $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99earlykdump/%{remove_dracut_prefix %{SOURCE108}}
|
||||||
chmod 755 $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99earlykdump/%{remove_dracut_early_kdump_prefix %{SOURCE109}}
|
chmod 755 $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99earlykdump/%{remove_dracut_early_kdump_prefix %{SOURCE109}}
|
||||||
|
%ifarch ppc64 ppc64le
|
||||||
|
mkdir -p -m755 $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99zz-fadumpinit
|
||||||
|
cp %{SOURCE200} $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99zz-fadumpinit/%{remove_dracut_fadump_prefix %{SOURCE200}}
|
||||||
|
cp %{SOURCE201} $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99zz-fadumpinit/%{remove_dracut_fadump_prefix %{SOURCE201}}
|
||||||
|
chmod 755 $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99zz-fadumpinit/%{remove_dracut_fadump_prefix %{SOURCE200}}
|
||||||
|
chmod 755 $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99zz-fadumpinit/%{remove_dracut_fadump_prefix %{SOURCE201}}
|
||||||
|
%endif
|
||||||
|
|
||||||
|
|
||||||
%define dracutlibdir %{_prefix}/lib/dracut
|
%define dracutlibdir %{_prefix}/lib/dracut
|
||||||
|
@ -238,6 +275,13 @@ mv $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/* $RPM_BUILD_ROOT/%{d
|
||||||
%systemd_post kdump.service
|
%systemd_post kdump.service
|
||||||
|
|
||||||
touch /etc/kdump.conf
|
touch /etc/kdump.conf
|
||||||
|
|
||||||
|
%ifarch ppc64 ppc64le
|
||||||
|
servicelog_notify --remove --command=/usr/lib/kdump/kdump-migrate-action.sh 2>/dev/null
|
||||||
|
servicelog_notify --add --command=/usr/lib/kdump/kdump-migrate-action.sh --match='refcode="#MIGRATE" and serviceable=0' --type=EVENT --method=pairs_stdin
|
||||||
|
%endif
|
||||||
|
|
||||||
|
|
||||||
# This portion of the script is temporary. Its only here
|
# This portion of the script is temporary. Its only here
|
||||||
# to fix up broken boxes that require special settings
|
# to fix up broken boxes that require special settings
|
||||||
# in /etc/sysconfig/kdump. It will be removed when
|
# in /etc/sysconfig/kdump. It will be removed when
|
||||||
|
@ -265,6 +309,9 @@ fi
|
||||||
%systemd_postun_with_restart kdump.service
|
%systemd_postun_with_restart kdump.service
|
||||||
|
|
||||||
%preun
|
%preun
|
||||||
|
%ifarch ppc64 ppc64le
|
||||||
|
servicelog_notify --remove --command=/usr/lib/kdump/kdump-migrate-action.sh
|
||||||
|
%endif
|
||||||
# Package removal, not upgrade
|
# Package removal, not upgrade
|
||||||
%systemd_preun kdump.service
|
%systemd_preun kdump.service
|
||||||
|
|
||||||
|
@ -275,7 +322,7 @@ fi
|
||||||
/usr/bin/systemd-sysv-convert --save kdump >/dev/null 2>&1 ||:
|
/usr/bin/systemd-sysv-convert --save kdump >/dev/null 2>&1 ||:
|
||||||
|
|
||||||
# Run these because the SysV package being removed won't do them
|
# Run these because the SysV package being removed won't do them
|
||||||
/sbin/chkconfig --del kdump >/dev/null 2>&1 || :
|
/usr/sbin/chkconfig --del kdump >/dev/null 2>&1 || :
|
||||||
/bin/systemctl try-restart kdump.service >/dev/null 2>&1 || :
|
/bin/systemctl try-restart kdump.service >/dev/null 2>&1 || :
|
||||||
|
|
||||||
|
|
||||||
|
@ -302,10 +349,11 @@ do
|
||||||
done
|
done
|
||||||
|
|
||||||
%files
|
%files
|
||||||
/sbin/kexec
|
/usr/sbin/kexec
|
||||||
/sbin/makedumpfile
|
/usr/sbin/makedumpfile
|
||||||
/sbin/mkdumprd
|
/usr/sbin/mkdumprd
|
||||||
/sbin/vmcore-dmesg
|
/usr/sbin/mkfadumprd
|
||||||
|
/usr/sbin/vmcore-dmesg
|
||||||
%{_bindir}/*
|
%{_bindir}/*
|
||||||
%{_datadir}/kdump
|
%{_datadir}/kdump
|
||||||
%{_prefix}/lib/kdump
|
%{_prefix}/lib/kdump
|
||||||
|
@ -313,13 +361,17 @@ done
|
||||||
%{_sysconfdir}/makedumpfile.conf.sample
|
%{_sysconfdir}/makedumpfile.conf.sample
|
||||||
%endif
|
%endif
|
||||||
%config(noreplace,missingok) %{_sysconfdir}/sysconfig/kdump
|
%config(noreplace,missingok) %{_sysconfdir}/sysconfig/kdump
|
||||||
%config(noreplace,missingok) %{_sysconfdir}/kdump.conf
|
%config(noreplace,missingok) %verify(not mtime) %{_sysconfdir}/kdump.conf
|
||||||
%ifnarch s390x
|
%ifnarch s390x
|
||||||
%config %{_udevrulesdir}
|
%config %{_udevrulesdir}
|
||||||
%{_udevrulesdir}/../kdump-udev-throttler
|
%{_udevrulesdir}/../kdump-udev-throttler
|
||||||
%endif
|
%endif
|
||||||
%{dracutlibdir}/modules.d/*
|
%{dracutlibdir}/modules.d/*
|
||||||
%dir %{_localstatedir}/crash
|
%dir %{_localstatedir}/crash
|
||||||
|
%dir %{_sysconfdir}/kdump
|
||||||
|
%dir %{_sysconfdir}/kdump/pre.d
|
||||||
|
%dir %{_sysconfdir}/kdump/post.d
|
||||||
|
%dir %{_sharedstatedir}/kdump
|
||||||
%{_mandir}/man8/kdumpctl.8.gz
|
%{_mandir}/man8/kdumpctl.8.gz
|
||||||
%{_mandir}/man8/kexec.8.gz
|
%{_mandir}/man8/kexec.8.gz
|
||||||
%{_mandir}/man8/makedumpfile.8.gz
|
%{_mandir}/man8/makedumpfile.8.gz
|
||||||
|
@ -328,11 +380,13 @@ done
|
||||||
%{_mandir}/man5/*
|
%{_mandir}/man5/*
|
||||||
%{_unitdir}/kdump.service
|
%{_unitdir}/kdump.service
|
||||||
%{_prefix}/lib/systemd/system-generators/kdump-dep-generator.sh
|
%{_prefix}/lib/systemd/system-generators/kdump-dep-generator.sh
|
||||||
|
%{_prefix}/lib/kernel/install.d/60-kdump.install
|
||||||
%doc News
|
%doc News
|
||||||
%license COPYING
|
%license COPYING
|
||||||
%doc TODO
|
%doc TODO
|
||||||
%doc kexec-kdump-howto.txt
|
%doc kexec-kdump-howto.txt
|
||||||
%doc early-kdump-howto.txt
|
%doc early-kdump-howto.txt
|
||||||
|
%doc fadump-howto.txt
|
||||||
%doc supported-kdump-targets.txt
|
%doc supported-kdump-targets.txt
|
||||||
%doc kdump-in-cluster-environment.txt
|
%doc kdump-in-cluster-environment.txt
|
||||||
%doc live-image-kdump-howto.txt
|
%doc live-image-kdump-howto.txt
|
||||||
|
@ -342,6 +396,473 @@ done
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Wed Feb 21 2024 Pingfan Liu <piliu@redhat.com> - 2.0.26-14
|
||||||
|
- dracut-module-setup: Skip initrd-cleanup and initrd-parse-etc in kdump
|
||||||
|
|
||||||
|
* Fri Feb 2 2024 Pingfan Liu <piliu@redhat.com> - 2.0.26-13
|
||||||
|
- dracut-module-setup.sh: also install the driver of physical NIC for Hyper-V VM with accelerated networking
|
||||||
|
|
||||||
|
* Wed Nov 22 2023 Pingfan Liu <piliu@redhat.com> - 2.0.26-12
|
||||||
|
- kdumpctl: Only returns immediately after an error occurs in check_*_modified
|
||||||
|
|
||||||
|
* Thu Nov 9 2023 Pingfan Liu <piliu@redhat.com> - 2.0.26-11
|
||||||
|
- powerpc: update kdumpctl to load kernel signing key for fadump
|
||||||
|
- powerpc: update kdumpctl to remove deletion of kernel signing key once loaded
|
||||||
|
|
||||||
|
* Tue Sep 26 2023 Pingfan Liu <piliu@redhat.com> - 2.0.26-10
|
||||||
|
- Introduce a function to get reserved memory size
|
||||||
|
|
||||||
|
* Tue Sep 19 2023 Pingfan Liu <piliu@redhat.com> - 2.0.26-9
|
||||||
|
- Add lvm thin provision to kdump supported-kdump-targets.txt
|
||||||
|
|
||||||
|
* Thu Aug 10 2023 Pingfan Liu <piliu@redhat.com> - 2.0.26-8
|
||||||
|
- mkdumprd: Use the correct syntax to redirect the stderr to null
|
||||||
|
- mkdumprd: call dracut with --add-device to install the drivers needed by /boot partition automatically for FIPS
|
||||||
|
- Add NICs that handle DNS queries to the allowlist
|
||||||
|
|
||||||
|
* Wed Jul 12 2023 Pingfan Liu <piliu@redhat.com> - 2.0.26-7
|
||||||
|
- Revert "Revert "Append both nofail and x-systemd.before to kdump mount target"
|
||||||
|
|
||||||
|
* Thu Jun 29 2023 Pingfan Liu <piliu@redhat.com> - 2.0.26-6
|
||||||
|
- dracut-module-setup.sh: skip installing driver for the loopback interface
|
||||||
|
- Reduce kdump memory consumption by only installing needed NIC drivers
|
||||||
|
|
||||||
|
* Tue Jun 13 2023 Pingfan Liu <piliu@redhat.com> - 2.0.26-5
|
||||||
|
- Revert "Append both nofail and x-systemd.before to kdump mount target"
|
||||||
|
|
||||||
|
* Wed May 31 2023 Pingfan Liu <piliu@redhat.com> - 2.0.26-4
|
||||||
|
- Only rename the virtual Azure Hyper-V network interface
|
||||||
|
|
||||||
|
* Tue May 16 2023 Pingfan Liu <piliu@redhat.com> - 2.0.26-3
|
||||||
|
- Don't rename Azure Hyper-V network interface
|
||||||
|
|
||||||
|
* Thu Apr 20 2023 Pingfan Liu <piliu@redhat.com> - 2.0.26-2
|
||||||
|
- sadump: fix failure of reading memory when 5-level paging is enabled
|
||||||
|
|
||||||
|
* Tue Apr 4 2023 Pingfan Liu <piliu@redhat.com> - 2.0.25-7
|
||||||
|
- Rebase makedumpfile to 1.7.2
|
||||||
|
|
||||||
|
* Tue Mar 14 2023 Pingfan Liu <piliu@redhat.com> - 2.0.25-6
|
||||||
|
- sysconfig: add zfcp.allow_lun_scan to KDUMP_COMMANDLINE_REMOVE on s390
|
||||||
|
|
||||||
|
* Wed Jan 18 2023 Pingfan Liu <piliu@redhat.com> - 2.0.25-5
|
||||||
|
- dracut-module-setup: Fix invalid rd.znet command line entry
|
||||||
|
- dracut-module-setup: Fix persistent nic name on s390
|
||||||
|
|
||||||
|
* Mon Jan 9 2023 Pingfan Liu <piliu@redhat.com> - 2.0.25-4
|
||||||
|
- Don't check fs modified when dump target is lvm2 thinp
|
||||||
|
- Add dependency of dracut lvmthinpool-monitor module
|
||||||
|
- lvm.conf should be check modified if lvm2 thinp enabled
|
||||||
|
- Add lvm2 thin provision dump target checker
|
||||||
|
- Fix the sync issue for dump_fs
|
||||||
|
|
||||||
|
* Fri Dec 2 2022 Pingfan Liu <piliu@redhat.com> - 2.0.25-3
|
||||||
|
- kdump.conf: use a simple generator script to maintain
|
||||||
|
- Reduce kdump memory consumption by not letting NetworkManager manage unneeded network interfaces
|
||||||
|
|
||||||
|
* Mon Oct 17 2022 Pingfan Liu <piliu@redhat.com> - 2.0.25-2
|
||||||
|
- mkdumprd: Improve error messages on non-existing NFS target directories
|
||||||
|
- fadump: avoid non-debug kernel use for fadump case
|
||||||
|
|
||||||
|
* Sun Sep 18 2022 Pingfan Liu <piliu@redhat.com> - 2.0.24-7
|
||||||
|
- kdumpctl: make the kdump.log root-readable-only
|
||||||
|
|
||||||
|
* Mon Jul 18 2022 Pingfan Liu <piliu@redhat.com> - 2.0.24-6
|
||||||
|
- kdump-lib: Add the CoreOS kernel dir to the boot_dirlist
|
||||||
|
- kdump-lib: attempt to fix BOOT_IMAGE detection
|
||||||
|
- kdump-lib: change how ostree based systems are detected
|
||||||
|
- kdump-lib: clear up references to Atomic/CoreOS
|
||||||
|
|
||||||
|
* Mon Jul 4 2022 Pingfan Liu <piliu@redhat.com> - 2.0.24-5
|
||||||
|
- kdump-lib: use non-debug kernels first
|
||||||
|
|
||||||
|
* Tue Jun 21 2022 Pingfan Liu <piliu@redhat.com> - 2.0.24-4
|
||||||
|
- kdump-lib.sh: Check the output of blkid with sed instead of eval
|
||||||
|
|
||||||
|
* Fri Jun 10 2022 Pingfan Liu <piliu@redhat.com> - 2.0.24-3
|
||||||
|
- kdump.sysconfig*: add ignition.firstboot to KDUMP_COMMANDLINE_REMOVE
|
||||||
|
|
||||||
|
* Fri May 27 2022 Pingfan Liu <piliu@redhat.com> - 2.0.24-2
|
||||||
|
- kdumpctl: fix missed dollar sign
|
||||||
|
|
||||||
|
* Thu May 5 2022 Pingfan Liu <piliu@redhat.com> - 2.0.24-1
|
||||||
|
- kdumpctl: sync the $TARGET_INITRD after rebuild
|
||||||
|
- Avoid false-positive mem_section validation with vmlinux
|
||||||
|
- Rebase kexec-tools to 2.0.24
|
||||||
|
- Rebase makedumpfile to 1.7.1
|
||||||
|
|
||||||
|
* Fri Apr 15 2022 Pingfan Liu <piliu@redhat.com> - 2.0.20-69
|
||||||
|
- s390: add support for --reuse-cmdline
|
||||||
|
- use slurp_proc_file() in get_command_line()
|
||||||
|
- add slurp_proc_file()
|
||||||
|
- s390: use KEXEC_ALL_OPTIONS
|
||||||
|
- s390: add variable command line size
|
||||||
|
- util_lib/elf_info: harden parsing of printk buffer
|
||||||
|
- print error when reading with unsupported compression
|
||||||
|
- use cycle detection when parsing the prink log_buf
|
||||||
|
- use pointer arithmetics for dump_dmesg
|
||||||
|
- add generic cycle detection
|
||||||
|
|
||||||
|
* Thu Jan 27 2022 Pingfan Liu <piliu@redhat.com> - 2.0.20-68
|
||||||
|
- Revert "Remove trace_buf_size and trace_event from the kernel bootparameters of the kdump kernel"
|
||||||
|
|
||||||
|
* Fri Dec 24 2021 Pingfan Liu <piliu@redhat.com> - 2.0.20-67
|
||||||
|
- Remove trace_buf_size and trace_event from the kernel bootparameters of the kdump kernel
|
||||||
|
|
||||||
|
* Fri Dec 10 2021 Pingfan Liu <piliu@redhat.com> - 2.0.20-66
|
||||||
|
- kdump/ppc64: suppress the error message "Could not find a registered notification tool" from servicelog_notify
|
||||||
|
- Enable zstd compression for makedumpfile in kexec-tools.spec
|
||||||
|
|
||||||
|
* Thu Dec 2 2021 Pingfan Liu <piliu@redhat.com> - 2.0.20-65
|
||||||
|
- mkdumprd: drop mountaddr/mountproto nfs mount options
|
||||||
|
|
||||||
|
* Fri Nov 26 2021 Pingfan Liu <piliu@redhat.com> - 2.0.20-64
|
||||||
|
- add keytuils as a weak dependency for POWER
|
||||||
|
|
||||||
|
* Fri Nov 19 2021 Pingfan Liu <piliu@redhat.com> - 2.0.20-63
|
||||||
|
- Document/kexec-kdump-howto.txt: fix escape
|
||||||
|
|
||||||
|
* Wed Nov 17 2021 Pingfan Liu <piliu@redhat.com> - 2.0.20-62
|
||||||
|
- Document/kexec-kdump-howto.txt: improve notes for kdump_pre and kdump_post scripts
|
||||||
|
|
||||||
|
* Tue Nov 9 2021 Pingfan Liu <piliu@redhat.com> - 2.0.20-61
|
||||||
|
- rebase makedumpfile to 1.7.0
|
||||||
|
|
||||||
|
* Fri Oct 22 2021 Pingfan Liu <piliu@redhat.com> - 2.0.20-60
|
||||||
|
- fadump-init: clean up mount points properly
|
||||||
|
- fadump: kdumpctl should check the modules used by the fadump initramfs
|
||||||
|
- fadump: isolate fadump initramfs image within the default one
|
||||||
|
- mkdumprd: Use xz for squash image compression
|
||||||
|
|
||||||
|
* Mon Oct 18 2021 Pingfan Liu <piliu@redhat.com> - 2.0.20-59
|
||||||
|
- makedumpfile: printk: use committed/finalized state values
|
||||||
|
- makedumpfile: printk: add support for lockless ringbuffer
|
||||||
|
- kexec-tools: printk: Use %zu to format size_t
|
||||||
|
- kexec-tools: printk: Use ULL suffix for 64-bit constants
|
||||||
|
- kexec-tools: printk: add support for lockless ringbuffer
|
||||||
|
|
||||||
|
* Sun Oct 17 2021 Pingfan Liu <piliu@redhat.com> - 2.0.20-58
|
||||||
|
- kdumpctl: fix fragile loops over find output
|
||||||
|
|
||||||
|
* Fri Aug 27 2021 Pingfan Liu <piliu@redhat.com> - 2.0.20-57
|
||||||
|
- kdumpctl: enable secure boot on ppc64le LPARs
|
||||||
|
|
||||||
|
* Fri Aug 6 2021 Pingfan Liu <piliu@redhat.com> - 2.0.20-56
|
||||||
|
- kdumpctl: fix a typo
|
||||||
|
|
||||||
|
* Mon Aug 2 2021 Pingfan Liu <piliu@redhat.com> - 2.0.20-55
|
||||||
|
- kdump/ppc64: migration action registration clean up
|
||||||
|
|
||||||
|
* Fri Jul 23 2021 Pingfan Liu <piliu@redhat.com> - 2.0.20-54
|
||||||
|
- kdump/ppc64: rebuild initramfs image after migration
|
||||||
|
- Check the existence of /sys/bus/ccwgroup/devices/*/online beforehand
|
||||||
|
- kdump.sysconfig.s390: Remove "prot_virt" from kdump kernel cmdline
|
||||||
|
|
||||||
|
* Fri Jul 2 2021 Pingfan Liu <piliu@redhat.com> - 2.0.20-53
|
||||||
|
- check for invalid physical address of /proc/kcore when making ELF dumpfile
|
||||||
|
- check for invalid physical address of /proc/kcore when finding max_paddr
|
||||||
|
- fix format issue in find_online_znet_device
|
||||||
|
- check the existence of /sys/bus/ccwgroup/devices before trying to find online network device
|
||||||
|
- kdump-lib.sh: fix a warning in prepare_kdump_bootinfo()
|
||||||
|
|
||||||
|
* Thu Jun 17 2021 Pingfan Liu <piliu@redhat.com> - 2.0.20-52
|
||||||
|
- Write to `/var/lib/kdump` if $KDUMP_BOOTDIR not writable
|
||||||
|
- Iterate /sys/bus/ccwgroup/devices to tell if we should set up rd.znet
|
||||||
|
- mkdumprd: display the absolute path of dump location in the check_user_configured_target()
|
||||||
|
|
||||||
|
* Wed Jun 2 2021 Pingfan Liu <piliu@redhat.com> - 2.0.20-51
|
||||||
|
- Stop reloading kdump service on CPU hotplug event for FADump
|
||||||
|
- fadump: improve fadump-howto.txt about remote dump target setup
|
||||||
|
|
||||||
|
* Tue May 25 2021 Pingfan Liu <piliu@redhat.com> - 2.0.20-50
|
||||||
|
- rd.route should use the name from kdump_setup_ifname
|
||||||
|
- get kdump ifname once in kdump_install_netdev
|
||||||
|
|
||||||
|
* Tue May 25 2021 Pingfan Liu <piliu@redhat.com> - 2.0.20-49
|
||||||
|
- kdump-lib.sh: fix the case if no enough total RAM for kdump in get_recommend_size()
|
||||||
|
|
||||||
|
* Thu May 20 2021 Pingfan Liu <piliu@redhat.com> - 2.0.20-48
|
||||||
|
- kdumpctl: Add kdumpctl estimate
|
||||||
|
- mkdumprd: make use of the new get_luks_crypt_dev helper
|
||||||
|
- kdump-lib.sh: introduce a helper to get all crypt dev used by kdump
|
||||||
|
- kdump-lib.sh: introduce a helper to get underlying crypt device
|
||||||
|
- RHEL-only: keep total memory size coherent to RHEL-only kernel patch
|
||||||
|
- Show write byte size in report messages
|
||||||
|
- Add shorthand --show-stats option to show report stats
|
||||||
|
- Add --dry-run option to prevent writing the dumpfile
|
||||||
|
- kdump-lib.sh: introduce functions to return recommened mem size
|
||||||
|
|
||||||
|
* Mon May 10 2021 Pingfan Liu <piliu@redhat.com> - 2.0.20-47
|
||||||
|
- Implement IP netmask calculation to replace "ipcalc -m"
|
||||||
|
- kdumpctl: fix check_config error when kdump.conf is empty
|
||||||
|
- Fix incorrect vmcore permissions when dumped through ssh
|
||||||
|
- Fix incorrect permissions on kdump dmesg file
|
||||||
|
|
||||||
|
* Mon Jan 25 2021 Pingfan Liu <piliu@redhat.com> - 2.0.20-45
|
||||||
|
- origin/rhel-8.4.0) Revert "Revert "Append both nofail and x-systemd.before to kdump mount target""
|
||||||
|
- kdump.conf: add ipv6 example for nfs and ssh dump
|
||||||
|
- fix kdump failure of saving vmcore with the scp + ipv6 method
|
||||||
|
|
||||||
|
* Fri Jan 22 2021 Pingfan Liu <piliu@redhat.com> - 2.0.20-44
|
||||||
|
- module-setup.sh: don't polute the namespace unnecessarily
|
||||||
|
- module-setup.sh: don't source $dracutfunctions
|
||||||
|
- logger: source the logger file individually
|
||||||
|
- dracut-module-setup.sh: enable ForwardToConsole=yes in fadump mode
|
||||||
|
|
||||||
|
* Fri Jan 15 2021 Pingfan Liu <piliu@redhat.com> - 2.0.20-43
|
||||||
|
- Always include watchdog-modules
|
||||||
|
- mkdumprd: Ensure kdumpbase is added
|
||||||
|
- Move watchdog detect and install code to module-setup.sh
|
||||||
|
- Add a helper to omit non-mandatory dracut module
|
||||||
|
- Move some dracut module dependencies checks to module-setup.sh
|
||||||
|
- Set watchdog's pretimeout to zero in kdump kernel
|
||||||
|
- kdump-lib.sh: Use a more generic helper to detect omitted dracut module
|
||||||
|
- Fix the watchdog drivers detection code
|
||||||
|
- Add a helper for detecting watchdog drivers
|
||||||
|
- Remove a redundant nfs check
|
||||||
|
- kdumpctl: split the driver detection from fs dection function
|
||||||
|
- kdump.service: use ConditionKernelCommandLine=crashkernel
|
||||||
|
- Revert "Append both nofail and x-systemd.before to kdump mount target"
|
||||||
|
- Revert "Don's try to restart dracut-initqueue if it's already failed"
|
||||||
|
- Fix dump_fs mount point detection and fallback mount
|
||||||
|
- kdump.conf: Update doc about core_collector for ssh target
|
||||||
|
- Save the final failure information to log file if saving vmcore failed
|
||||||
|
- Doc: Improve the kdump sysconfig document
|
||||||
|
- kdumpctl: fix a variable expansion in check_fence_kdump_config()
|
||||||
|
- Fedora 33 rhpkg build bug
|
||||||
|
|
||||||
|
* Tue Dec 22 2020 Pingfan Liu <piliu@redhat.com> - 2.0.20-42
|
||||||
|
- makedumpfile: add support for ARMv8.2 LVA 52 bits
|
||||||
|
|
||||||
|
* Fri Dec 18 2020 Pingfan Liu <piliu@redhat.com> - 2.0.20-41
|
||||||
|
- Doc: improve mkdumprd man page
|
||||||
|
|
||||||
|
* Tue Dec 15 2020 Pingfan Liu <piliu@redhat.com> - 2.0.20-40
|
||||||
|
- Rework on dracut-module-setup.sh: Use systemctl call to replace ln_r
|
||||||
|
|
||||||
|
* Tue Dec 15 2020 Pingfan Liu <piliu@redhat.com> - 2.0.20-39
|
||||||
|
- dracut-module-setup.sh: Use systemctl call to replace ln_r
|
||||||
|
|
||||||
|
* Fri Dec 11 2020 Pingfan Liu <piliu@redhat.com> - 2.0.20-38
|
||||||
|
- Don's try to restart dracut-initqueue if it's already failed
|
||||||
|
- fadump-howto: update about 'nocma' and 'off' options for 'fadump=' parameter
|
||||||
|
- dracut-module-setup.sh: use auto6 for ipv6
|
||||||
|
- module-setup.sh: enable vlan on team interface
|
||||||
|
- Fix rootfs detection in dump_fs
|
||||||
|
- Remove RHEL-only patch: kexec-tools-2.0.18-makedumpfile-arm64-Add-support-for-ARMv8.2-LVA-52-bi.patch
|
||||||
|
- Rebase to makedumpfile-1.6.8 (step1)
|
||||||
|
|
||||||
|
* Fri Nov 13 2020 Pingfan Liu <piliu@redhat.com> - 2.0.20-37
|
||||||
|
- Doc: improve the usage documentation of the logger
|
||||||
|
- Update the kdump sysconfig
|
||||||
|
- Capitalize the configuration name of log level
|
||||||
|
- Add the rd.kdumploglvl option to control log level in the second kernel
|
||||||
|
- Appropriately converts logger numeric level to syslog log level
|
||||||
|
- Remove unused log levels for kdump logger
|
||||||
|
- Add sanity checks for the log levels
|
||||||
|
- Add code comments to help better understanding
|
||||||
|
- Doc: add a documentation for the usage of logger
|
||||||
|
- Improve debugging in the kdump kernel
|
||||||
|
- kdumpctl: add the '-d' option to enable the kexec loading debugging messages
|
||||||
|
- kdump.sysconfig: add the kdump logger configurations
|
||||||
|
- enable the logger for kdump
|
||||||
|
- introduce the kdump logger from the dracut
|
||||||
|
|
||||||
|
* Fri Nov 6 2020 Pingfan Liu <piliu@redhat.com> - 2.0.20-36
|
||||||
|
- arm64: Enable 'kexec_file_load' by default
|
||||||
|
- Fix, Add a kernel install hook to clean up kdump initramfs
|
||||||
|
|
||||||
|
* Fri Oct 30 2020 Pingfan Liu <piliu@redhat.com> - 2.0.20-35
|
||||||
|
- module-setup.sh: Instead of drop journalctl log, just don't read kmsg
|
||||||
|
- s390x: enable the kexec file load by default
|
||||||
|
- increase makdumpfile default message level to 7
|
||||||
|
- Rework check_config and warn on any duplicated option
|
||||||
|
- kdumpctl: Error out if path is set more than once.
|
||||||
|
- Don't drop journalctl content if failure action is "shell"
|
||||||
|
- dracut-module-install: Move systemd conf install code to a function
|
||||||
|
- kdump-lib.sh: Remove is_atomic
|
||||||
|
- Refactor kernel image and initrd detection code
|
||||||
|
- early-kdump: Use consistent symbol link for kernel and initramfs
|
||||||
|
- kdump-lib: strip grub device from kdump_bootdir
|
||||||
|
- kdumpctl: fix driver change detection on latest Fedora
|
||||||
|
- Revert "kdump-lib: disable efifb if hyperv_fb is in use"
|
||||||
|
- kdump-lib.sh: detect secure boot on s390
|
||||||
|
- Add a kernel install hook to clean up kdump initramfs
|
||||||
|
|
||||||
|
* Wed Aug 19 2020 Pingfan Liu <piliu@redhat.com> - 2.0.20-34
|
||||||
|
- kdump-lib: disable efifb if hyperv_fb is in use
|
||||||
|
|
||||||
|
* Tue Aug 18 2020 Pingfan Liu <piliu@redhat.com> - 2.0.20-33
|
||||||
|
- sadump, kaslr: fix failure of calculating kaslr_offset due to an sadump format restriction
|
||||||
|
|
||||||
|
* Mon Aug 3 2020 Pingfan Liu <piliu@redhat.com> - 2.0.20-32
|
||||||
|
- kdumpctl: exit if either pre.d or post.d is missing
|
||||||
|
|
||||||
|
* Wed Jul 22 2020 Pingfan Liu <piliu@redhat.com> - 2.0.20-31
|
||||||
|
- ppc64/kdump: use kexec_file_load when secureboot is enabled
|
||||||
|
- kdump_pre: make notes more precise
|
||||||
|
- dracut-kdump.sh: exit shell when machine reboot
|
||||||
|
- kdump.conf: fix a grammar issue
|
||||||
|
- kdumpctl: detect modification of scripts by its directory's timestamp
|
||||||
|
- module-setup.sh: suppress false alarm
|
||||||
|
- kexec-tools.spec: make the existence of pre.d and post.d mandatory
|
||||||
|
|
||||||
|
* Tue Jul 14 2020 Pingfan Liu <piliu@redhat.com> - 2.0.20-30
|
||||||
|
- x86_64: enable the kexec file load by default
|
||||||
|
- Revert "kdump-lib: switch to the kexec_file_load() syscall on x86_64 by default"
|
||||||
|
|
||||||
|
* Wed Jun 24 2020 Pingfan Liu <piliu@redhat.com> - 2.0.20-29
|
||||||
|
- mkdumprd: Improve the error message for umounted dump target
|
||||||
|
|
||||||
|
* Wed Jun 24 2020 Pingfan Liu <piliu@redhat.com> - 2.0.20-28
|
||||||
|
- mkdumprd: Fix nfs detection in to_mount
|
||||||
|
- Always wrap up call to dracut get_persistent_dev function
|
||||||
|
- man: improve description about /etc/kdump/{pre.d,post.d}interface
|
||||||
|
|
||||||
|
* Tue Jun 16 2020 Pingfan Liu <piliu@redhat.com> - 2.0.20-27
|
||||||
|
- kdump-lib: switch to the kexec_file_load() syscall on x86_64 by default
|
||||||
|
|
||||||
|
* Mon Jun 15 2020 Pingfan Liu <piliu@redhat.com> - 2.0.20-26
|
||||||
|
- Fix kdump failure when mount target specified by dracut_args
|
||||||
|
- mkdumprd: Fix dracut error on multiple extra_modules
|
||||||
|
|
||||||
|
* Mon Jun 15 2020 Pingfan Liu <piliu@redhat.com> - 2.0.20-25
|
||||||
|
- kdump.conf: Specify /etc/kdump/{pre.d,post.d}interface
|
||||||
|
- dracut-kdump.sh: Execute the binary and script filesin /etc/kdump/{pre.d,post.d}
|
||||||
|
- kdumpctl: Check the update of the binary and script files in /etc/kdump/{pre.d,post.d}
|
||||||
|
- dracut-module-setup.sh: Install files under /etc/kdump/{pre.d,post.d} into kdump initramfs
|
||||||
|
|
||||||
|
* Thu Jun 4 2020 Pingfan Liu <piliu@redhat.com> - 2.0.20-24
|
||||||
|
- fadump: update fadump-howto.txt with some more troubleshooting help
|
||||||
|
|
||||||
|
* Wed Jun 3 2020 Pingfan Liu <piliu@redhat.com> - 2.0.20-23
|
||||||
|
- fadump-howto.txt: source it in spec file
|
||||||
|
|
||||||
|
* Mon Jun 1 2020 Pingfan Liu <piliu@redhat.com> - 2.0.20-22
|
||||||
|
- mkdumprd: Use DUMP_TARGET which printing error message during ssh
|
||||||
|
|
||||||
|
* Mon Jun 1 2020 Pingfan Liu <piliu@redhat.com> - 2.0.20-21
|
||||||
|
- Don't inherit swiotlb parameter form 1st kernel by default
|
||||||
|
- Add a new option 'rd.znet_ifname' in order to use it in udev rules
|
||||||
|
- kdump.sysconfig: Remove the option 'log_buf_len' from kdump command line
|
||||||
|
- kdump-error-handler.service: Remove ExecStopPost
|
||||||
|
- module-setup.sh: Add "rd.neednet" parameter if network is needed
|
||||||
|
|
||||||
|
* Thu May 28 2020 Pingfan Liu <piliu@redhat.com> - 2.0.20-20
|
||||||
|
- Update docs for the new noauto dump target support
|
||||||
|
- kexec-kdump-howto.txt: Add some format to the document
|
||||||
|
- mkdumprd: generate usable kdump initramfs even target is not mounted
|
||||||
|
- Use get_mount_info to replace findmnt calls
|
||||||
|
- kdump-lib.sh: add fstab failback helper for getting mount info
|
||||||
|
- Allow calling mkdumprd from kdumpctl even if targat not mounted
|
||||||
|
- Add a is_mounted helper
|
||||||
|
- Introduce get_kdump_mntpoint_from_target and fix duplicated /
|
||||||
|
- Doc: Improves the early-kdump-howto.txt document in several points
|
||||||
|
- Doc: Add --force option to step 2 in early-kdump-howto.txt
|
||||||
|
- Doc: Fix typo in early-kdump-howto.txt
|
||||||
|
- Remove adjust_bind_mount_path call
|
||||||
|
- No longer treat atomic/silverblue specially
|
||||||
|
- mkdumprd: Simplify handling of user specified target
|
||||||
|
- mkdumprd: Use get_save_path instead of parsing config
|
||||||
|
- Remove is_dump_target_configured
|
||||||
|
- Always use get_save_path to get the 'path' option
|
||||||
|
- kdump-lib: Don't abuse echo, and clean up
|
||||||
|
- mkdumprd: Fix dracut args parsing
|
||||||
|
- mkdumprd: simplify dracut args parsing
|
||||||
|
|
||||||
|
* Thu May 21 2020 Pingfan Liu <piliu@redhat.com> - 2.0.20-19
|
||||||
|
- dracut-module-setup.sh: improve get_alias()
|
||||||
|
- fadump: update fadump-howto.txt with some troubleshooting help
|
||||||
|
- Append both nofail and x-systemd.before to kdump mount target
|
||||||
|
- Partially Revert "Don't mount the dump target unless needed"
|
||||||
|
- Don't unmount the dump target just after saving vmcore
|
||||||
|
|
||||||
|
* Mon May 11 2020 Pingfan Liu <piliu@redhat.com> - 2.0.20-18
|
||||||
|
- makedumpfile: Avoid false-positive failure in mem_seciton validation
|
||||||
|
|
||||||
|
* Tue Apr 21 2020 Pingfan Liu <piliu@redhat.com> - 2.0.20-17
|
||||||
|
- mkdumprd: Use makedumpfile --check-params option
|
||||||
|
|
||||||
|
* Thu Apr 9 2020 Pingfan Liu <piliu@redhat.com> - 2.0.20-16
|
||||||
|
- makedumpfile update to latest
|
||||||
|
|
||||||
|
* Wed Apr 1 2020 Pingfan Liu <piliu@redhat.com> - 2.0.20-15
|
||||||
|
- makedumpfile rebase to 1.6.7
|
||||||
|
|
||||||
|
* Tue Feb 18 2020 Pingfan Liu <piliu@redhat.com> - 2.0.20-14
|
||||||
|
- kexec-tools/module-setup: Ensure eth devices get IP address for VLAN
|
||||||
|
|
||||||
|
* Wed Feb 12 2020 Pingfan Liu <piliu@redhat.com> - 2.0.20-13
|
||||||
|
- Add document to declare FCoE support
|
||||||
|
|
||||||
|
* Wed Feb 12 2020 Pingfan Liu <piliu@redhat.com> - 2.0.20-12
|
||||||
|
- powerpc: enable the scripts to capture dump on POWERNV platform
|
||||||
|
|
||||||
|
* Tue Feb 4 2020 Pingfan Liu <piliu@redhat.com> - 2.0.20-11
|
||||||
|
- s390: Use get_kaslr_offset_general() for s390x
|
||||||
|
|
||||||
|
* Fri Jan 10 2020 Pingfan Liu <piliu@redhat.com> - 2.0.20-10
|
||||||
|
- arm64: kdump: deal with a lot of resource entries in /proc/iomem
|
||||||
|
- arm64: kexec: allocate memory space avoiding reserved regions
|
||||||
|
- kexec: add variant helper functions for handling memory regions
|
||||||
|
|
||||||
|
* Thu Dec 12 2019 Pingfan Liu <piliu@redhat.com> - 2.0.20-9
|
||||||
|
- makedumpfile: assign bitmap1/2 fd for subprocess in non-cyclic mode
|
||||||
|
|
||||||
|
* Mon Dec 2 2019 Pingfan Liu <piliu@redhat.com> - 2.0.20-8
|
||||||
|
- makedumpfile: remove -lebl
|
||||||
|
|
||||||
|
* Thu Nov 28 2019 Pingfan Liu <piliu@redhat.com> - 2.0.20-7
|
||||||
|
- makedumpfile: Fix off-by-one issue in exclude_nodata_pages()
|
||||||
|
|
||||||
|
* Wed Nov 27 2019 Pingfan Liu <piliu@redhat.com> - 2.0.20-6
|
||||||
|
-rhel-8.2.0, origin/rhel-8.2.0) Increase SECTION_MAP_LAST_BIT to 4
|
||||||
|
- spec: move binaries from /sbin to /usr/sbin
|
||||||
|
- As /etc/kdump.conf timestamp is updated do not compare it when doing rpm --verify
|
||||||
|
- kdumpctl: make reload fail proof
|
||||||
|
|
||||||
|
* Tue Nov 12 2019 Pingfan Liu <piliu@redhat.com> - 2.0.20-5
|
||||||
|
- Don't execute final_action if failure_action terminates the system
|
||||||
|
- module-setup: re-fix 99kdumpbase network dependency
|
||||||
|
- kdumpctl: bail out immediately if host key verification failed
|
||||||
|
- kdumpctl: echo msg when waiting for connection
|
||||||
|
- kdumpctl: distinguish the failed reason of ssh
|
||||||
|
- kdumpctl: wait a while for network ready if dump target is ssh
|
||||||
|
- dracut-module-setup: filter out localhost for generic_fence_kdump
|
||||||
|
- dracut-module-setup: get localhost alias by manual
|
||||||
|
|
||||||
|
* Mon Oct 28 2019 Pingfan Liu <piliu@redhat.com> - 2.0.19-12.4
|
||||||
|
- dracut-module-setup.sh: Don't use squash module for fadump
|
||||||
|
- Don't mount the dump target unless needed
|
||||||
|
- dracut-module-setup: fix bond ifcfg processing
|
||||||
|
- Doc: amend the man page of kdump.conf
|
||||||
|
|
||||||
|
* Mon Oct 28 2019 Pingfan Liu <piliu@redhat.com> - 2.0.19-12.3
|
||||||
|
- Limit the size of vmcore-dmesg.txt to 2G
|
||||||
|
- makedumpfile: x86_64: Fix incorrect exclusion by -e option with KASLR
|
||||||
|
- mkdumprd: ensure ssh path exists before check size
|
||||||
|
|
||||||
|
* Fri Oct 18 2019 Pingfan Liu <piliu@redhat.com> - 2.0.19-12.2
|
||||||
|
- rebase to kexec-tools-2.0.20 and makedumpfile-1.6.6
|
||||||
|
|
||||||
|
* Fri Aug 9 2019 Pingfan Liu <piliu@redhat.com> - 2.0.19-12
|
||||||
|
- Don't forward and drop journalctl logs for fadump
|
||||||
|
|
||||||
|
* Mon Aug 5 2019 Pingfan Liu <piliu@redhat.com> - 2.0.19-11
|
||||||
|
- Drop switch root capability for non fadump initramfs
|
||||||
|
|
||||||
|
* Mon Aug 5 2019 Pingfan Liu <piliu@redhat.com> - 2.0.19-10
|
||||||
|
- Forward logs in kdump kernel to console directly
|
||||||
|
|
||||||
|
* Fri Jul 19 2019 Pingfan Liu <piliu@redhat.com> - 2.0.19-9
|
||||||
|
- kexec/arm64: Add support for handling zlib compressed (Image.gz) image
|
||||||
|
- kexec/kexec-zlib.h: Add 'is_zlib_file()' helper function
|
||||||
|
- kexec-uImage-arm64.c: Fix return value of uImage_arm64_probe()
|
||||||
|
- kexec/kexec.c: Add the missing close() for fd used for kexec_file_load()
|
||||||
|
|
||||||
|
* Sun Jul 14 2019 Pingfan Liu <piliu@redhat.com> - 2.0.19-8
|
||||||
|
- kdump.sysconfig/x86_64: Disable HEST by default
|
||||||
|
|
||||||
* Mon Jun 17 2019 Kairui Song <kasong@redhat.com> - 2.0.19-7
|
* Mon Jun 17 2019 Kairui Song <kasong@redhat.com> - 2.0.19-7
|
||||||
- dracut-kdump-capture.service: Use OnFailureJobMode instead of deprecated OnFailureIsolate
|
- dracut-kdump-capture.service: Use OnFailureJobMode instead of deprecated OnFailureIsolate
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue