Update kexec-tools/makedumpfile to support v5.10 kernel
This patch updates kexec-tools from 2.0.15 to 2.0.21 (and its supporting software package makedumpfile from 1.6.2 to 1.6.9) for compatibility with the newer v5.10 kernel. This commit clones the kexec-tools package's supporting files from commit 26a7a543427eac59ed39728466f3d95d320f735a in the CentOS RPM packaging git repository. Links for reference: -26a7a54342
-26a7a54342
Please note that this patch causes the build system to pull in and extract an SRPM file to acquire: kdump-anaconda-addon-003-29-g4c517c5.tar.gz This is done for security, because the only public reference to commit 4c517c5 is on a Red Hat developer's personal Github account: https://github.com/ryncsn/kdump-anaconda-addon/commits/rhel-7 kexec-tools package's supporting files cloned by this commit trigger a large number of shell script linting errors. Given that the shell scripts in question are inherited from upstream (i.e., CentOS 7), the "files" directory of this package is excluded from automated linting via the changes in tox.ini. Verification: A kexec-tools RPM package built with this commit was installed onto an existing StarlingX system. A vmcore file was succesfully collected from a kernel crash triggered with /proc/sysrq-trigger. A recent version of the crash utility was found to succesfully parse the collected vmcore file. Credits: Thanks to Jiping Ma for helping with cleaning up and publishing an earlier version of this patch. Story: 2008921 Task: 43040 Depends-On: https://review.opendev.org/c/starlingx/tools/+/805127 Signed-off-by: Jiping Ma <jiping.ma2@windriver.com> Signed-off-by: M. Vefa Bicakci <vefa.bicakci@windriver.com> Change-Id: Idc4e523610e4c09259300c8b67ea5e0fbe59c611
This commit is contained in:
parent
87c27d1be8
commit
7e10236038
@ -218,3 +218,6 @@ python-boto3
|
||||
|
||||
# Pf bbdev configuration tool for ACC100 (Mt. Bryce)
|
||||
pf-bb-config
|
||||
|
||||
# kexec-tools
|
||||
kexec-tools
|
||||
|
@ -94,3 +94,4 @@ python/python-daemon
|
||||
base/inih
|
||||
base/pf-bb-config
|
||||
gpu/gpu-operator
|
||||
tools/kexec-tools
|
||||
|
@ -15,6 +15,7 @@ dpdk-6ece49ad5a26f5e2f5c4af6c06c30376c0ddc387.tar.gz#dpdk#https://api.github.com
|
||||
dpkg_1.18.24.tar.xz#dpkg-1.18.24#http://http.debian.net/debian/pool/main/d/dpkg/dpkg_1.18.24.tar.xz#http##
|
||||
drbd-utils-9.15.1.tar.gz#drbd-utils-9.15.1#https://pkg.linbit.com//downloads/drbd/utils/drbd-utils-9.15.1.tar.gz#https##
|
||||
dtc-1.4.4.tar.gz#dtc-1.4.4#https://www.kernel.org/pub/software/utils/dtc/dtc-1.4.4.tar.gz#http##
|
||||
eppic_050615.tar.gz#eppic#https://src.fedoraproject.org/repo/extras/kexec-tools/eppic_050615.tar.gz/sha512/de23c3cd59ded23f2f0092c194b2169e78fcd385a8df7daf34b36f3bb2d5ddac2cdd3657bbe640beec447725988e928962baf62cf9deff8849da734390280a4f/eppic_050615.tar.gz#https##
|
||||
etcd-v3.3.15.tar.gz#etcd-v3.3.15#https://github.com/etcd-io/etcd/archive/v3.3.15.tar.gz#http##
|
||||
gf-complete-7e61b44404f0ed410c83cfd3947a52e88ae044e1.tar.gz#gf-complete#https://api.github.com/repos/ceph/gf-complete/tarball/7e61b44404f0ed410c83cfd3947a52e88ae044e1#https##
|
||||
# gnocchi-4.2.5.tar.gz#gnocchi-4.2.5#https://pypi.io/packages/source/g/gnocchi/gnocchi-4.2.5.tar.gz#http##
|
||||
@ -29,6 +30,8 @@ helm-v3.2.1-linux-amd64.tar.gz#linux-amd64#https://get.helm.sh/helm-v3.2.1-linux
|
||||
isa-l-7e1a337433a340bc0974ed0f04301bdaca374af6.tar.gz#isa-l#https://api.github.com/repos/ceph/isa-l/tarball/7e1a337433a340bc0974ed0f04301bdaca374af6#https##
|
||||
isa-l_crypto-603529a4e06ac8a1662c13d6b31f122e21830352.tar.gz#isa-l_crypto#https://api.github.com/repos/01org/isa-l_crypto/tarball/603529a4e06ac8a1662c13d6b31f122e21830352#https##
|
||||
jerasure-96c76b89d661c163f65a014b8042c9354ccf7f31.tar.gz#jerasure#https://api.github.com/repos/ceph/jerasure/tarball/96c76b89d661c163f65a014b8042c9354ccf7f31#https##
|
||||
kexec-tools-2.0.21.tar.xz#kexec-tools-2.0.21#https://www.kernel.org/pub/linux/utils/kernel/kexec/kexec-tools-2.0.21.tar.xz#https##
|
||||
!kdump-anaconda-addon-003-29-g4c517c5.tar.gz#kexec-tools#https://vault.centos.org/7.6.1810/os/Source/SPackages/kexec-tools-2.0.15-21.el7.src.rpm#https##
|
||||
keycodemapdb-16e5b07.tar.gz#keycodemapdb#https://github.com/CendioOssman/keycodemapdb/tarball/16e5b0787687d8904dad2c026107409eb9bfcb95#http##
|
||||
kubernetes-contrib-v1.18.1.tar.gz#kubernetes-contrib-1.18.1#https://github.com/kubernetes-retired/contrib/tarball/89f6948e24578fed2a90a87871b2263729f90ac3#http##
|
||||
kubernetes-v1.18.1.tar.gz#kubernetes-1.18.1#https://github.com/kubernetes/kubernetes/archive/7879fc12a63337efff607952a323df90cdc7a335.tar.gz#http##
|
||||
@ -40,6 +43,7 @@ ldapscripts-2.0.8.tgz#ldapscripts-2.0.8#https://sourceforge.net/projects/ldapscr
|
||||
libtpms-0.6.0-4f0d59d.tar.gz#libtpms-0.6.0#https://github.com/stefanberger/libtpms/tarball/c421ca0f4d00c0caceeda8d62c1efb2b7e47db04#http##
|
||||
lldpd-0.9.0.tar.gz#lldpd-0.9.0#https://media.luffy.cx/files/lldpd/lldpd-0.9.0.tar.gz#http##
|
||||
lua-1fce39c6397056db645718b8f5821571d97869a4.tar.gz#lua#https://api.github.com/repos/ceph/lua/tarball/1fce39c6397056db645718b8f5821571d97869a4#https##
|
||||
makedumpfile-1.6.9.tar.gz#makedumpfile-1.6.9#https://github.com/makedumpfile/makedumpfile/releases/download/1.6.9/makedumpfile-1.6.9.tar.gz#https##
|
||||
!mariadb-10.1.28.tar.gz#mariadb-10.1.28#https://github.com/MariaDB/server/archive/mariadb-10.1.28.tar.gz#http_script##post-dl-script/mariadb.sh
|
||||
openstack-helm-infra-c9d6676bf9a5aceb311dc31dadd07cba6a3d6392.tar.gz#openstack-helm-infra#https://github.com/openstack/openstack-helm-infra/archive/c9d6676bf9a5aceb311dc31dadd07cba6a3d6392.tar.gz#http##
|
||||
openvswitch-2.11.0.tar.gz#openvswitch-2.11.0#https://github.com/openvswitch/ovs/archive/v2.11.0.tar.gz#http##
|
||||
|
19
tools/kexec-tools/PKG-INFO
Normal file
19
tools/kexec-tools/PKG-INFO
Normal file
@ -0,0 +1,19 @@
|
||||
Metadata-Version: 1.0
|
||||
Name: kexec-tools
|
||||
Version: 2.0.21
|
||||
Summary: The kexec/kdump userspace component.
|
||||
Home-page: https://git.kernel.org/pub/scm/utils/kernel/kexec/kexec-tools.git/
|
||||
Author:
|
||||
Author-email:
|
||||
License: GPLv2
|
||||
|
||||
Description:
|
||||
/sbin/kexec is a user space utility for loading another kernel
|
||||
and asking the currently running kernel to do something with it.
|
||||
A currently running kernel may be asked to start the loaded
|
||||
kernel on reboot, or to start the loaded kernel after it panics.
|
||||
|
||||
The panic case is useful for having an intact kernel for writing
|
||||
crash dumps. But other uses may be imagined.
|
||||
|
||||
Platform: UNKNOWN
|
8
tools/kexec-tools/centos/build_srpm.data
Normal file
8
tools/kexec-tools/centos/build_srpm.data
Normal file
@ -0,0 +1,8 @@
|
||||
COPY_LIST="
|
||||
$STX_BASE/downloads/kexec-tools-2.0.21.tar.xz \
|
||||
$STX_BASE/downloads/makedumpfile-1.6.9.tar.gz \
|
||||
$STX_BASE/downloads/eppic_050615.tar.gz \
|
||||
$STX_BASE/downloads/kdump-anaconda-addon-003-29-g4c517c5.tar.gz \
|
||||
$PKG_BASE/files/*
|
||||
"
|
||||
TIS_PATCH_VER=PKG_GITREVCOUNT+1
|
325
tools/kexec-tools/centos/kexec-tools.spec
Normal file
325
tools/kexec-tools/centos/kexec-tools.spec
Normal file
@ -0,0 +1,325 @@
|
||||
Name: kexec-tools
|
||||
Version: 2.0.21
|
||||
Release: 1%{?_tis_dist}.%{tis_patch_ver}
|
||||
License: GPLv2
|
||||
Group: Applications/System
|
||||
Summary: The kexec/kdump userspace component.
|
||||
Source0: http://kernel.org/pub/linux/utils/kernel/kexec/%{name}-%{version}.tar.xz
|
||||
Source1: kdumpctl
|
||||
Source2: kdump.sysconfig
|
||||
Source3: kdump.sysconfig.x86_64
|
||||
Source7: mkdumprd
|
||||
Source8: kdump.conf
|
||||
Source9: makedumpfile-1.6.9.tar.gz
|
||||
Source10: kexec-kdump-howto.txt
|
||||
Source12: mkdumprd.8
|
||||
Source14: 98-kexec.rules
|
||||
Source15: kdump.conf.5
|
||||
Source16: kdump.service
|
||||
Source19: eppic_050615.tar.gz
|
||||
Source20: kdump-lib.sh
|
||||
Source21: kdump-in-cluster-environment.txt
|
||||
Source22: supported-kdump-targets.txt
|
||||
Source23: kdump-dep-generator.sh
|
||||
Source24: kdump-lib-initramfs.sh
|
||||
Source25: kdump-anaconda-addon-003-29-g4c517c5.tar.gz
|
||||
Source28: kdumpctl.8
|
||||
|
||||
#######################################
|
||||
# These are sources for mkdumpramfs
|
||||
# Which is currently in development
|
||||
#######################################
|
||||
Source100: dracut-kdump.sh
|
||||
Source101: dracut-module-setup.sh
|
||||
Source102: dracut-monitor_dd_progress
|
||||
Source103: dracut-kdump-error-handler.sh
|
||||
Source104: dracut-kdump-emergency.service
|
||||
Source105: dracut-kdump-error-handler.service
|
||||
Source106: dracut-kdump-capture.service
|
||||
Source107: dracut-kdump-emergency.target
|
||||
|
||||
Requires(post): systemd-units
|
||||
Requires(preun): systemd-units
|
||||
Requires(postun): systemd-units
|
||||
Requires(pre): coreutils sed zlib
|
||||
Requires: dracut >= 033-552
|
||||
Requires: dracut-network >= 033-552
|
||||
Requires: ethtool
|
||||
BuildRequires: zlib-devel zlib zlib-static elfutils-devel-static glib2-devel bzip2-devel ncurses-devel bison flex lzo-devel snappy-devel
|
||||
BuildRequires: pkgconfig intltool gettext
|
||||
BuildRequires: systemd-units
|
||||
%ifarch %{ix86} x86_64
|
||||
Obsoletes: diskdumputils netdump
|
||||
%endif
|
||||
|
||||
|
||||
#START INSERT
|
||||
|
||||
#
|
||||
# Patches 0 through 100 are meant for x86 kexec-tools enablement
|
||||
#
|
||||
|
||||
#
|
||||
# Patches 101 through 200 are meant for x86_64 kexec-tools enablement
|
||||
#
|
||||
|
||||
#
|
||||
# Patches 601 through 700 are meant for arm64 kexec-tools enablement
|
||||
#
|
||||
#
|
||||
# Patches 701 onward are generic patches
|
||||
#
|
||||
|
||||
#
|
||||
# Patch 701 through 800 are meant for kdump anaconda addon
|
||||
#
|
||||
|
||||
%description
|
||||
kexec-tools provides /sbin/kexec binary that facilitates a new
|
||||
kernel to boot using the kernel's kexec feature either on a
|
||||
normal or a panic reboot. This package contains the /sbin/kexec
|
||||
binary and ancillary utilities that together form the userspace
|
||||
component of the kernel's kexec feature.
|
||||
|
||||
%ifarch %{ix86} x86_64
|
||||
%package eppic
|
||||
Requires: %{name} = %{version}-%{release}
|
||||
Summary: Additional eppic_makedumpfile.so shared object
|
||||
Group: Applications/System
|
||||
|
||||
%description eppic
|
||||
The eppic_makedumpfile.so shared object is loaded by the
|
||||
"makedumpfile --eppic" option, and is used to erase sensitive
|
||||
or confidential kernel data from a dumpfile.
|
||||
%endif
|
||||
|
||||
%package anaconda-addon
|
||||
Summary: Kdump configration anaconda addon
|
||||
Requires: anaconda >= 19.31.85
|
||||
%description anaconda-addon
|
||||
Kdump anaconda addon
|
||||
|
||||
%prep
|
||||
%setup -q
|
||||
|
||||
mkdir -p -m755 kcp
|
||||
tar -z -x -v -f %{SOURCE9}
|
||||
tar -z -x -v -f %{SOURCE19}
|
||||
tar -z -x -v -f %{SOURCE25}
|
||||
|
||||
|
||||
|
||||
|
||||
%build
|
||||
%configure \
|
||||
--sbindir=/sbin
|
||||
rm -f kexec-tools.spec.in
|
||||
# setup the docs
|
||||
cp %{SOURCE10} .
|
||||
cp %{SOURCE21} .
|
||||
cp %{SOURCE22} .
|
||||
|
||||
make
|
||||
%ifarch %{ix86} x86_64
|
||||
make -C eppic/libeppic
|
||||
make -C makedumpfile-1.6.9 LINKTYPE=dynamic USELZO=on USESNAPPY=on
|
||||
make -C makedumpfile-1.6.9 LDFLAGS="-I../eppic/libeppic -L../eppic/libeppic" eppic_makedumpfile.so
|
||||
%endif
|
||||
make -C kdump-anaconda-addon/po
|
||||
|
||||
%install
|
||||
mkdir -p -m755 $RPM_BUILD_ROOT/sbin
|
||||
mkdir -p -m755 $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig
|
||||
mkdir -p -m755 $RPM_BUILD_ROOT%{_localstatedir}/crash
|
||||
mkdir -p -m755 $RPM_BUILD_ROOT%{_mandir}/man8/
|
||||
mkdir -p -m755 $RPM_BUILD_ROOT%{_mandir}/man5/
|
||||
mkdir -p -m755 $RPM_BUILD_ROOT%{_docdir}
|
||||
mkdir -p -m755 $RPM_BUILD_ROOT%{_datadir}/kdump
|
||||
mkdir -p -m755 $RPM_BUILD_ROOT%{_udevrulesdir}
|
||||
mkdir -p $RPM_BUILD_ROOT%{_unitdir}
|
||||
mkdir -p -m755 $RPM_BUILD_ROOT%{_bindir}
|
||||
mkdir -p -m755 $RPM_BUILD_ROOT%{_libdir}
|
||||
mkdir -p -m755 $RPM_BUILD_ROOT%{_prefix}/lib/kdump
|
||||
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/vmcore-dmesg $RPM_BUILD_ROOT/sbin/vmcore-dmesg
|
||||
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/
|
||||
|
||||
SYSCONFIG=$RPM_SOURCE_DIR/kdump.sysconfig.%{_target_cpu}
|
||||
[ -f $SYSCONFIG ] || SYSCONFIG=$RPM_SOURCE_DIR/kdump.sysconfig.%{_arch}
|
||||
[ -f $SYSCONFIG ] || SYSCONFIG=$RPM_SOURCE_DIR/kdump.sysconfig
|
||||
install -m 644 $SYSCONFIG $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/kdump
|
||||
|
||||
install -m 755 %{SOURCE7} $RPM_BUILD_ROOT/sbin/mkdumprd
|
||||
install -m 644 %{SOURCE8} $RPM_BUILD_ROOT%{_sysconfdir}/kdump.conf
|
||||
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 %{SOURCE28} $RPM_BUILD_ROOT%{_mandir}/man8/kdumpctl.8
|
||||
install -m 755 %{SOURCE20} $RPM_BUILD_ROOT%{_prefix}/lib/kdump/kdump-lib.sh
|
||||
install -m 755 %{SOURCE24} $RPM_BUILD_ROOT%{_prefix}/lib/kdump/kdump-lib-initramfs.sh
|
||||
install -m 644 %{SOURCE14} $RPM_BUILD_ROOT%{_udevrulesdir}/98-kexec.rules
|
||||
install -m 644 %{SOURCE15} $RPM_BUILD_ROOT%{_mandir}/man5/kdump.conf.5
|
||||
install -m 644 %{SOURCE16} $RPM_BUILD_ROOT%{_unitdir}/kdump.service
|
||||
install -m 755 -D %{SOURCE23} $RPM_BUILD_ROOT%{_prefix}/lib/systemd/system-generators/kdump-dep-generator.sh
|
||||
|
||||
%ifarch %{ix86} x86_64
|
||||
install -m 755 makedumpfile-1.6.9/makedumpfile $RPM_BUILD_ROOT/sbin/makedumpfile
|
||||
install -m 644 makedumpfile-1.6.9/makedumpfile.8.gz $RPM_BUILD_ROOT/%{_mandir}/man8/makedumpfile.8.gz
|
||||
install -m 644 makedumpfile-1.6.9/makedumpfile.conf.5.gz $RPM_BUILD_ROOT/%{_mandir}/man5/makedumpfile.conf.5.gz
|
||||
install -m 644 makedumpfile-1.6.9/makedumpfile.conf $RPM_BUILD_ROOT/%{_sysconfdir}/makedumpfile.conf.sample
|
||||
install -m 755 makedumpfile-1.6.9/eppic_makedumpfile.so $RPM_BUILD_ROOT/%{_libdir}/eppic_makedumpfile.so
|
||||
mkdir -p $RPM_BUILD_ROOT/usr/share/makedumpfile/eppic_scripts/
|
||||
install -m 644 makedumpfile-1.6.9/eppic_scripts/* $RPM_BUILD_ROOT/usr/share/makedumpfile/eppic_scripts/
|
||||
%endif
|
||||
make -C kdump-anaconda-addon install DESTDIR=$RPM_BUILD_ROOT
|
||||
%find_lang kdump-anaconda-addon
|
||||
|
||||
%define remove_dracut_prefix() %(echo -n %1|sed 's/.*dracut-//g')
|
||||
|
||||
# deal with dracut modules
|
||||
mkdir -p -m755 $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpbase
|
||||
cp %{SOURCE100} $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpbase/%{remove_dracut_prefix %{SOURCE100}}
|
||||
cp %{SOURCE101} $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpbase/%{remove_dracut_prefix %{SOURCE101}}
|
||||
cp %{SOURCE102} $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpbase/%{remove_dracut_prefix %{SOURCE102}}
|
||||
cp %{SOURCE103} $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpbase/%{remove_dracut_prefix %{SOURCE103}}
|
||||
cp %{SOURCE104} $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpbase/%{remove_dracut_prefix %{SOURCE104}}
|
||||
cp %{SOURCE105} $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpbase/%{remove_dracut_prefix %{SOURCE105}}
|
||||
cp %{SOURCE106} $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpbase/%{remove_dracut_prefix %{SOURCE106}}
|
||||
cp %{SOURCE107} $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpbase/%{remove_dracut_prefix %{SOURCE107}}
|
||||
chmod 755 $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpbase/%{remove_dracut_prefix %{SOURCE100}}
|
||||
chmod 755 $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpbase/%{remove_dracut_prefix %{SOURCE101}}
|
||||
|
||||
|
||||
%define dracutlibdir %{_prefix}/lib/dracut
|
||||
#and move the custom dracut modules to the dracut directory
|
||||
mkdir -p $RPM_BUILD_ROOT/%{dracutlibdir}/modules.d/
|
||||
mv $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/* $RPM_BUILD_ROOT/%{dracutlibdir}/modules.d/
|
||||
|
||||
%post
|
||||
# Initial installation
|
||||
%systemd_post kdump.service
|
||||
|
||||
touch /etc/kdump.conf
|
||||
# This portion of the script is temporary. Its only here
|
||||
# to fix up broken boxes that require special settings
|
||||
# in /etc/sysconfig/kdump. It will be removed when
|
||||
# These systems are fixed.
|
||||
|
||||
if [ -d /proc/bus/mckinley ]
|
||||
then
|
||||
# This is for HP zx1 machines
|
||||
# They require machvec=dig on the kernel command line
|
||||
sed -e's/\(^KDUMP_COMMANDLINE_APPEND.*\)\("$\)/\1 machvec=dig"/' \
|
||||
/etc/sysconfig/kdump > /etc/sysconfig/kdump.new
|
||||
mv /etc/sysconfig/kdump.new /etc/sysconfig/kdump
|
||||
elif [ -d /proc/sgi_sn ]
|
||||
then
|
||||
# This is for SGI SN boxes
|
||||
# They require the --noio option to kexec
|
||||
# since they don't support legacy io
|
||||
sed -e's/\(^KEXEC_ARGS.*\)\("$\)/\1 --noio"/' \
|
||||
/etc/sysconfig/kdump > /etc/sysconfig/kdump.new
|
||||
mv /etc/sysconfig/kdump.new /etc/sysconfig/kdump
|
||||
fi
|
||||
|
||||
|
||||
%postun
|
||||
%systemd_postun_with_restart kdump.service
|
||||
|
||||
%preun
|
||||
# Package removal, not upgrade
|
||||
%systemd_preun kdump.service
|
||||
|
||||
%triggerun -- kexec-tools < 2.0.2-3
|
||||
# Save the current service runlevel info
|
||||
# User must manually run systemd-sysv-convert --apply kdump
|
||||
# to migrate them to systemd targets
|
||||
/usr/bin/systemd-sysv-convert --save kdump >/dev/null 2>&1 ||:
|
||||
|
||||
# Run these because the SysV package being removed won't do them
|
||||
/sbin/chkconfig --del kdump >/dev/null 2>&1 || :
|
||||
/bin/systemctl try-restart kdump.service >/dev/null 2>&1 || :
|
||||
|
||||
|
||||
%triggerin -- kernel-kdump
|
||||
touch %{_sysconfdir}/kdump.conf
|
||||
|
||||
|
||||
%triggerpostun -- kernel kernel-xen kernel-debug kernel-PAE kernel-kdump
|
||||
# List out the initrds here, strip out version nubmers
|
||||
# and search for corresponding kernel installs, if a kernel
|
||||
# is not found, remove the corresponding kdump initrd
|
||||
|
||||
#start by getting a list of all the kdump initrds
|
||||
MY_ARCH=`uname -m`
|
||||
IMGDIR=/boot
|
||||
|
||||
for i in `ls $IMGDIR/initramfs*kdump.img 2>/dev/null`
|
||||
do
|
||||
KDVER=`echo $i | sed -e's/^.*initramfs-//' -e's/kdump.*$//'`
|
||||
if [ ! -e $IMGDIR/vmlinuz-$KDVER ]
|
||||
then
|
||||
# We have found an initrd with no corresponding kernel
|
||||
# so we should be able to remove it
|
||||
rm -f $i
|
||||
fi
|
||||
done
|
||||
|
||||
%files
|
||||
/sbin/kexec
|
||||
/sbin/vmcore-dmesg
|
||||
%ifarch %{ix86} x86_64
|
||||
/sbin/makedumpfile
|
||||
%endif
|
||||
/sbin/mkdumprd
|
||||
%{_bindir}/*
|
||||
%{_datadir}/kdump
|
||||
%{_prefix}/lib/kdump
|
||||
%ifarch %{ix86} x86_64
|
||||
%{_sysconfdir}/makedumpfile.conf.sample
|
||||
%endif
|
||||
%config(noreplace,missingok) %{_sysconfdir}/sysconfig/kdump
|
||||
%config(noreplace,missingok) %verify(not mtime) %{_sysconfdir}/kdump.conf
|
||||
%config %{_udevrulesdir}
|
||||
%{dracutlibdir}/modules.d/*
|
||||
%dir %{_localstatedir}/crash
|
||||
%{_mandir}/man8/kdumpctl.8.gz
|
||||
%{_mandir}/man8/kexec.8.gz
|
||||
%ifarch %{ix86} x86_64
|
||||
%{_mandir}/man8/makedumpfile.8.gz
|
||||
%endif
|
||||
%{_mandir}/man8/mkdumprd.8.gz
|
||||
%{_mandir}/man8/vmcore-dmesg.8.gz
|
||||
%{_mandir}/man5/*
|
||||
%{_unitdir}/kdump.service
|
||||
%{_prefix}/lib/systemd/system-generators/kdump-dep-generator.sh
|
||||
%doc News
|
||||
%doc COPYING
|
||||
%doc TODO
|
||||
%doc kexec-kdump-howto.txt
|
||||
%doc kdump-in-cluster-environment.txt
|
||||
%doc supported-kdump-targets.txt
|
||||
|
||||
%ifarch %{ix86} x86_64
|
||||
%files eppic
|
||||
%{_libdir}/eppic_makedumpfile.so
|
||||
/usr/share/makedumpfile/eppic_scripts/
|
||||
%endif
|
||||
|
||||
%files anaconda-addon -f kdump-anaconda-addon.lang
|
||||
%{_datadir}/anaconda/addons/com_redhat_kdump
|
||||
%{_datadir}/icons/hicolor/scalable/apps/kdump.svg
|
||||
%doc
|
||||
|
||||
%changelog
|
||||
* Fri Jul 30 2021 M. Vefa Bicakci <vefa.bicakci@windriver.com> 2.0.21-1.tis.1
|
||||
- Adapt to kexec-tools 2.0.21 for v5.10 kernel, while attempting to keep
|
||||
compatibility with CentOS 7.
|
||||
- Use makedumpfile 1.6.9 for compatibility with the v5.10 kernel.
|
||||
- Remove aarch64, PowerPC, ia64 and s390-related spec file sections.
|
||||
- Trim the spec file changelog.
|
||||
|
||||
* Thu Aug 30 2018 Pingfan Liu <piliu@redhat.com> 2.0.15-21
|
||||
- kexec/ppc64: add support to parse ibm, dynamic-memory-v2
|
4
tools/kexec-tools/files/98-kexec.rules
Normal file
4
tools/kexec-tools/files/98-kexec.rules
Normal file
@ -0,0 +1,4 @@
|
||||
SUBSYSTEM=="cpu", ACTION=="add", PROGRAM="/bin/systemctl try-restart kdump.service"
|
||||
SUBSYSTEM=="cpu", ACTION=="remove", PROGRAM="/bin/systemctl try-restart kdump.service"
|
||||
SUBSYSTEM=="memory", ACTION=="online", PROGRAM="/bin/systemctl try-restart kdump.service"
|
||||
SUBSYSTEM=="memory", ACTION=="offline", PROGRAM="/bin/systemctl try-restart kdump.service"
|
30
tools/kexec-tools/files/dracut-kdump-capture.service
Normal file
30
tools/kexec-tools/files/dracut-kdump-capture.service
Normal file
@ -0,0 +1,30 @@
|
||||
# This file is part of systemd.
|
||||
#
|
||||
# systemd is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU Lesser General Public License as published by
|
||||
# the Free Software Foundation; either version 2.1 of the License, or
|
||||
# (at your option) any later version.
|
||||
|
||||
[Unit]
|
||||
Description=Kdump Vmcore Save Service
|
||||
After=initrd.target initrd-parse-etc.service sysroot.mount
|
||||
After=dracut-initqueue.service dracut-pre-mount.service dracut-mount.service dracut-pre-pivot.service
|
||||
Before=initrd-cleanup.service
|
||||
ConditionPathExists=/etc/initrd-release
|
||||
OnFailure=emergency.target
|
||||
OnFailureIsolate=yes
|
||||
|
||||
[Service]
|
||||
Environment=DRACUT_SYSTEMD=1
|
||||
Environment=NEWROOT=/sysroot
|
||||
Type=oneshot
|
||||
ExecStart=/bin/kdump.sh
|
||||
StandardInput=null
|
||||
StandardOutput=syslog
|
||||
StandardError=syslog+console
|
||||
KillMode=process
|
||||
RemainAfterExit=yes
|
||||
|
||||
# Bash ignores SIGTERM, so we send SIGHUP instead, to ensure that bash
|
||||
# terminates cleanly.
|
||||
KillSignal=SIGHUP
|
28
tools/kexec-tools/files/dracut-kdump-emergency.service
Normal file
28
tools/kexec-tools/files/dracut-kdump-emergency.service
Normal file
@ -0,0 +1,28 @@
|
||||
# This file is part of systemd.
|
||||
#
|
||||
# systemd is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU Lesser General Public License as published by
|
||||
# the Free Software Foundation; either version 2.1 of the License, or
|
||||
# (at your option) any later version.
|
||||
|
||||
# This service will be placed in kdump initramfs and replace both the systemd
|
||||
# emergency service and dracut emergency shell. IOW, any emergency will be
|
||||
# kick this service and in turn isolating to kdump error handler.
|
||||
|
||||
[Unit]
|
||||
Description=Kdump Emergency
|
||||
DefaultDependencies=no
|
||||
IgnoreOnIsolate=yes
|
||||
|
||||
[Service]
|
||||
ExecStart=/usr/bin/systemctl --no-block isolate kdump-error-handler.service
|
||||
Type=oneshot
|
||||
StandardInput=tty-force
|
||||
StandardOutput=inherit
|
||||
StandardError=inherit
|
||||
KillMode=process
|
||||
IgnoreSIGPIPE=no
|
||||
|
||||
# Bash ignores SIGTERM, so we send SIGHUP instead, to ensure that bash
|
||||
# terminates cleanly.
|
||||
KillSignal=SIGHUP
|
14
tools/kexec-tools/files/dracut-kdump-emergency.target
Normal file
14
tools/kexec-tools/files/dracut-kdump-emergency.target
Normal file
@ -0,0 +1,14 @@
|
||||
# This file is part of systemd.
|
||||
#
|
||||
# systemd is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU Lesser General Public License as published by
|
||||
# the Free Software Foundation; either version 2.1 of the License, or
|
||||
# (at your option) any later version.
|
||||
|
||||
[Unit]
|
||||
Description=Emergency Mode
|
||||
Documentation=man:systemd.special(7)
|
||||
Requires=emergency.service
|
||||
After=emergency.service
|
||||
AllowIsolate=yes
|
||||
IgnoreOnIsolate=yes
|
34
tools/kexec-tools/files/dracut-kdump-error-handler.service
Normal file
34
tools/kexec-tools/files/dracut-kdump-error-handler.service
Normal file
@ -0,0 +1,34 @@
|
||||
# This file is part of systemd.
|
||||
#
|
||||
# systemd is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU Lesser General Public License as published by
|
||||
# the Free Software Foundation; either version 2.1 of the License, or
|
||||
# (at your option) any later version.
|
||||
|
||||
# This service will run the real kdump error handler code. Executing the
|
||||
# default action configured in kdump.conf
|
||||
|
||||
[Unit]
|
||||
Description=Kdump Error Handler
|
||||
DefaultDependencies=no
|
||||
After=systemd-vconsole-setup.service
|
||||
Wants=systemd-vconsole-setup.service
|
||||
AllowIsolate=yes
|
||||
|
||||
[Service]
|
||||
Environment=HOME=/
|
||||
Environment=DRACUT_SYSTEMD=1
|
||||
Environment=NEWROOT=/sysroot
|
||||
WorkingDirectory=/
|
||||
ExecStart=/bin/kdump-error-handler.sh
|
||||
ExecStopPost=-/usr/bin/systemctl --fail --no-block default
|
||||
Type=oneshot
|
||||
StandardInput=tty-force
|
||||
StandardOutput=inherit
|
||||
StandardError=inherit
|
||||
KillMode=process
|
||||
IgnoreSIGPIPE=no
|
||||
|
||||
# Bash ignores SIGTERM, so we send SIGHUP instead, to ensure that bash
|
||||
# terminates cleanly.
|
||||
KillSignal=SIGHUP
|
10
tools/kexec-tools/files/dracut-kdump-error-handler.sh
Executable file
10
tools/kexec-tools/files/dracut-kdump-error-handler.sh
Executable file
@ -0,0 +1,10 @@
|
||||
#!/bin/sh
|
||||
|
||||
. /lib/kdump-lib-initramfs.sh
|
||||
|
||||
set -o pipefail
|
||||
export PATH=$PATH:$KDUMP_SCRIPT_DIR
|
||||
|
||||
get_kdump_confs
|
||||
do_default_action
|
||||
do_final_action
|
204
tools/kexec-tools/files/dracut-kdump.sh
Executable file
204
tools/kexec-tools/files/dracut-kdump.sh
Executable file
@ -0,0 +1,204 @@
|
||||
#!/bin/sh
|
||||
|
||||
# continue here only if we have to save dump.
|
||||
if [ -f /etc/fadump.initramfs ] && [ ! -f /proc/device-tree/rtas/ibm,kernel-dump ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
exec &> /dev/console
|
||||
. /lib/dracut-lib.sh
|
||||
. /lib/kdump-lib-initramfs.sh
|
||||
|
||||
set -o pipefail
|
||||
DUMP_RETVAL=0
|
||||
|
||||
export PATH=$PATH:$KDUMP_SCRIPT_DIR
|
||||
|
||||
do_dump()
|
||||
{
|
||||
local _ret
|
||||
|
||||
eval $DUMP_INSTRUCTION
|
||||
_ret=$?
|
||||
|
||||
if [ $_ret -ne 0 ]; then
|
||||
echo "kdump: saving vmcore failed"
|
||||
fi
|
||||
|
||||
return $_ret
|
||||
}
|
||||
|
||||
do_kdump_pre()
|
||||
{
|
||||
if [ -n "$KDUMP_PRE" ]; then
|
||||
"$KDUMP_PRE"
|
||||
fi
|
||||
}
|
||||
|
||||
do_kdump_post()
|
||||
{
|
||||
if [ -n "$KDUMP_POST" ]; then
|
||||
"$KDUMP_POST" "$1"
|
||||
fi
|
||||
}
|
||||
|
||||
add_dump_code()
|
||||
{
|
||||
DUMP_INSTRUCTION=$1
|
||||
}
|
||||
|
||||
dump_raw()
|
||||
{
|
||||
local _raw=$1
|
||||
|
||||
[ -b "$_raw" ] || return 1
|
||||
|
||||
echo "kdump: saving to raw disk $_raw"
|
||||
|
||||
if ! $(echo -n $CORE_COLLECTOR|grep -q makedumpfile); then
|
||||
_src_size=`ls -l /proc/vmcore | cut -d' ' -f5`
|
||||
_src_size_mb=$(($_src_size / 1048576))
|
||||
monitor_dd_progress $_src_size_mb &
|
||||
fi
|
||||
|
||||
echo "kdump: saving vmcore"
|
||||
$CORE_COLLECTOR /proc/vmcore | dd of=$_raw bs=$DD_BLKSIZE >> /tmp/dd_progress_file 2>&1 || return 1
|
||||
sync
|
||||
|
||||
echo "kdump: saving vmcore complete"
|
||||
return 0
|
||||
}
|
||||
|
||||
dump_ssh()
|
||||
{
|
||||
local _opt="-i $1 -o BatchMode=yes -o StrictHostKeyChecking=yes"
|
||||
local _dir="$KDUMP_PATH/$HOST_IP-$DATEDIR"
|
||||
local _host=$2
|
||||
|
||||
echo "kdump: saving to $_host:$_dir"
|
||||
|
||||
cat /var/lib/random-seed > /dev/urandom
|
||||
ssh -q $_opt $_host mkdir -p $_dir || return 1
|
||||
|
||||
save_vmcore_dmesg_ssh ${DMESG_COLLECTOR} ${_dir} "${_opt}" $_host
|
||||
|
||||
echo "kdump: saving vmcore"
|
||||
|
||||
if [ "${CORE_COLLECTOR%%[[:blank:]]*}" = "scp" ]; then
|
||||
scp -q $_opt /proc/vmcore "$_host:$_dir/vmcore-incomplete" || return 1
|
||||
ssh $_opt $_host "mv $_dir/vmcore-incomplete $_dir/vmcore" || return 1
|
||||
else
|
||||
$CORE_COLLECTOR /proc/vmcore | ssh $_opt $_host "dd bs=512 of=$_dir/vmcore-incomplete" || return 1
|
||||
ssh $_opt $_host "mv $_dir/vmcore-incomplete $_dir/vmcore.flat" || return 1
|
||||
fi
|
||||
|
||||
echo "kdump: saving vmcore complete"
|
||||
return 0
|
||||
}
|
||||
|
||||
save_vmcore_dmesg_ssh() {
|
||||
local _dmesg_collector=$1
|
||||
local _path=$2
|
||||
local _opts="$3"
|
||||
local _location=$4
|
||||
|
||||
echo "kdump: saving vmcore-dmesg.txt"
|
||||
$_dmesg_collector /proc/vmcore | ssh $_opts $_location "dd of=$_path/vmcore-dmesg-incomplete.txt"
|
||||
_exitcode=$?
|
||||
|
||||
if [ $_exitcode -eq 0 ]; then
|
||||
ssh -q $_opts $_location mv $_path/vmcore-dmesg-incomplete.txt $_path/vmcore-dmesg.txt
|
||||
echo "kdump: saving vmcore-dmesg.txt complete"
|
||||
else
|
||||
echo "kdump: saving vmcore-dmesg.txt failed"
|
||||
fi
|
||||
}
|
||||
|
||||
get_host_ip()
|
||||
{
|
||||
local _host
|
||||
if is_nfs_dump_target || is_ssh_dump_target
|
||||
then
|
||||
kdumpnic=$(getarg kdumpnic=)
|
||||
[ -z "$kdumpnic" ] && echo "kdump: failed to get kdumpnic!" && return 1
|
||||
_host=`ip addr show dev $kdumpnic|grep '[ ]*inet'`
|
||||
[ $? -ne 0 ] && echo "kdump: wrong kdumpnic: $kdumpnic" && return 1
|
||||
_host=`echo $_host | head -n 1 | cut -d' ' -f2`
|
||||
_host="${_host%%/*}"
|
||||
[ -z "$_host" ] && echo "kdump: wrong kdumpnic: $kdumpnic" && return 1
|
||||
HOST_IP=$_host
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
read_kdump_conf()
|
||||
{
|
||||
if [ ! -f "$KDUMP_CONF" ]; then
|
||||
echo "kdump: $KDUMP_CONF not found"
|
||||
return
|
||||
fi
|
||||
|
||||
get_kdump_confs
|
||||
|
||||
# rescan for add code for dump target
|
||||
while read config_opt config_val;
|
||||
do
|
||||
# remove inline comments after the end of a directive.
|
||||
config_val=$(strip_comments $config_val)
|
||||
case "$config_opt" in
|
||||
dracut_args)
|
||||
config_val=$(get_dracut_args_target "$config_val")
|
||||
[[ -n "$config_val" ]] && add_dump_code "dump_fs $config_val"
|
||||
;;
|
||||
ext[234]|xfs|btrfs|minix|nfs)
|
||||
add_dump_code "dump_fs $config_val"
|
||||
;;
|
||||
raw)
|
||||
add_dump_code "dump_raw $config_val"
|
||||
;;
|
||||
ssh)
|
||||
add_dump_code "dump_ssh $SSH_KEY_LOCATION $config_val"
|
||||
;;
|
||||
esac
|
||||
done < $KDUMP_CONF
|
||||
}
|
||||
|
||||
fence_kdump_notify()
|
||||
{
|
||||
if [ -n "$FENCE_KDUMP_NODES" ]; then
|
||||
$FENCE_KDUMP_SEND $FENCE_KDUMP_ARGS $FENCE_KDUMP_NODES &
|
||||
fi
|
||||
}
|
||||
|
||||
read_kdump_conf
|
||||
fence_kdump_notify
|
||||
|
||||
get_host_ip
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "kdump: get_host_ip exited with non-zero status!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$DUMP_INSTRUCTION" ]; then
|
||||
add_dump_code "dump_fs $NEWROOT"
|
||||
fi
|
||||
|
||||
do_kdump_pre
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "kdump: kdump_pre script exited with non-zero status!"
|
||||
do_final_action
|
||||
fi
|
||||
make_trace_mem "kdump saving vmcore" '1:shortmem' '2+:mem' '3+:slab'
|
||||
do_dump
|
||||
DUMP_RETVAL=$?
|
||||
|
||||
do_kdump_post $DUMP_RETVAL
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "kdump: kdump_post script exited with non-zero status!"
|
||||
fi
|
||||
|
||||
if [ $DUMP_RETVAL -ne 0 ]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
do_final_action
|
782
tools/kexec-tools/files/dracut-module-setup.sh
Executable file
782
tools/kexec-tools/files/dracut-module-setup.sh
Executable file
@ -0,0 +1,782 @@
|
||||
#!/bin/bash
|
||||
|
||||
. $dracutfunctions
|
||||
. /lib/kdump/kdump-lib.sh
|
||||
|
||||
if ! [[ -d "${initdir}/tmp" ]]; then
|
||||
mkdir -p "${initdir}/tmp"
|
||||
fi
|
||||
|
||||
check() {
|
||||
[[ $debug ]] && set -x
|
||||
#kdumpctl sets this explicitly
|
||||
if [ -z "$IN_KDUMP" ] || [ ! -f /etc/kdump.conf ]
|
||||
then
|
||||
return 1
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
depends() {
|
||||
local _dep="base shutdown"
|
||||
|
||||
if [ -n "$( find /sys/devices -name drm )" ] || [ -d /sys/module/hyperv_fb ]; then
|
||||
_dep="$_dep drm"
|
||||
fi
|
||||
|
||||
if is_generic_fence_kdump -o is_pcs_fence_kdump; then
|
||||
_dep="$_dep network"
|
||||
fi
|
||||
|
||||
echo $_dep
|
||||
return 0
|
||||
}
|
||||
|
||||
kdump_to_udev_name() {
|
||||
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() {
|
||||
[ -d /sys/class/net/"$1"/bridge ]
|
||||
}
|
||||
|
||||
kdump_is_bond() {
|
||||
[ -d /sys/class/net/"$1"/bonding ]
|
||||
}
|
||||
|
||||
kdump_is_team() {
|
||||
[ -f /usr/bin/teamnl ] && teamnl $1 ports &> /dev/null
|
||||
}
|
||||
|
||||
kdump_is_vlan() {
|
||||
[ -f /proc/net/vlan/"$1" ]
|
||||
}
|
||||
|
||||
# $1: netdev name
|
||||
source_ifcfg_file() {
|
||||
local ifcfg_file
|
||||
|
||||
ifcfg_file=$(get_ifcfg_filename $1)
|
||||
if [ -f "${ifcfg_file}" ]; then
|
||||
. ${ifcfg_file}
|
||||
else
|
||||
dwarning "The ifcfg file of $1 is not found!"
|
||||
fi
|
||||
}
|
||||
|
||||
# $1: netdev name
|
||||
kdump_setup_dns() {
|
||||
local _nameserver _dns
|
||||
local _dnsfile=${initdir}/etc/cmdline.d/42dns.conf
|
||||
|
||||
source_ifcfg_file $1
|
||||
|
||||
[ -n "$DNS1" ] && echo "nameserver=$DNS1" > "$_dnsfile"
|
||||
[ -n "$DNS2" ] && echo "nameserver=$DNS2" >> "$_dnsfile"
|
||||
|
||||
while read content;
|
||||
do
|
||||
_nameserver=$(echo $content | grep ^nameserver)
|
||||
[ -z "$_nameserver" ] && continue
|
||||
|
||||
_dns=$(echo $_nameserver | cut -d' ' -f2)
|
||||
[ -z "$_dns" ] && continue
|
||||
|
||||
if [ ! -f $_dnsfile ] || [ ! $(cat $_dnsfile | grep -q $_dns) ]; then
|
||||
echo "nameserver=$_dns" >> "$_dnsfile"
|
||||
fi
|
||||
done < "/etc/resolv.conf"
|
||||
}
|
||||
|
||||
#$1: netdev name
|
||||
#$2: srcaddr
|
||||
#if it use static ip echo it, or echo null
|
||||
kdump_static_ip() {
|
||||
local _netdev="$1" _srcaddr="$2" _ipv6_flag
|
||||
local _netmask _gateway _ipaddr _target _nexthop
|
||||
|
||||
_ipaddr=$(ip addr show dev $_netdev permanent | awk "/ $_srcaddr\/.* /{print \$2}")
|
||||
|
||||
if is_ipv6_address $_srcaddr; then
|
||||
_ipv6_flag="-6"
|
||||
fi
|
||||
|
||||
if [ -n "$_ipaddr" ]; then
|
||||
_gateway=$(ip $_ipv6_flag route list dev $_netdev | \
|
||||
awk '/^default /{print $3}' | head -n 1)
|
||||
|
||||
if [ "x" != "x"$_ipv6_flag ]; then
|
||||
# _ipaddr="2002::56ff:feb6:56d5/64", _netmask is the number after "/"
|
||||
_netmask=${_ipaddr#*\/}
|
||||
_srcaddr="[$_srcaddr]"
|
||||
_gateway="[$_gateway]"
|
||||
else
|
||||
_netmask=$(ipcalc -m $_ipaddr | cut -d'=' -f2)
|
||||
fi
|
||||
echo -n "${_srcaddr}::${_gateway}:${_netmask}::"
|
||||
fi
|
||||
|
||||
/sbin/ip $_ipv6_flag route show | grep -v default | grep ".*via.* $_netdev " |\
|
||||
while read _route; do
|
||||
_target=`echo $_route | cut -d ' ' -f1`
|
||||
_nexthop=`echo $_route | cut -d ' ' -f3`
|
||||
if [ "x" != "x"$_ipv6_flag ]; then
|
||||
_target="[$_target]"
|
||||
_nexthop="[$_nexthop]"
|
||||
fi
|
||||
echo "rd.route=$_target:$_nexthop:$_netdev"
|
||||
done >> ${initdir}/etc/cmdline.d/45route-static.conf
|
||||
}
|
||||
|
||||
kdump_get_mac_addr() {
|
||||
cat /sys/class/net/$1/address
|
||||
}
|
||||
|
||||
#Bonding or team master modifies the mac address
|
||||
#of its slaves, we should use perm address
|
||||
kdump_get_perm_addr() {
|
||||
local addr=$(ethtool -P $1 | sed -e 's/Permanent address: //')
|
||||
if [ -z "$addr" ] || [ "$addr" = "00:00:00:00:00:00" ]
|
||||
then
|
||||
derror "Can't get the permanent address of $1"
|
||||
else
|
||||
echo "$addr"
|
||||
fi
|
||||
}
|
||||
|
||||
# Prefix kernel assigned names with "kdump-". EX: eth0 -> kdump-eth0
|
||||
# Because kernel assigned names are not persistent between 1st and 2nd
|
||||
# kernel. We could probably end up with eth0 being eth1, eth0 being
|
||||
# eth1, and naming conflict happens.
|
||||
kdump_setup_ifname() {
|
||||
local _ifname
|
||||
|
||||
# If ifname already has 'kdump-' prefix, we must be switching from
|
||||
# fadump to kdump. Skip prefixing 'kdump-' in this case as adding
|
||||
# another prefix may truncate the ifname. Since an ifname with
|
||||
# 'kdump-' is already persistent, this should be fine.
|
||||
if [[ $1 =~ eth* ]] && [[ ! $1 =~ ^kdump-* ]]; then
|
||||
_ifname="kdump-$1"
|
||||
else
|
||||
_ifname="$1"
|
||||
fi
|
||||
|
||||
echo "$_ifname"
|
||||
}
|
||||
|
||||
kdump_setup_bridge() {
|
||||
local _netdev=$1
|
||||
local _brif _dev _mac _kdumpdev
|
||||
for _dev in `ls /sys/class/net/$_netdev/brif/`; do
|
||||
_kdumpdev=$_dev
|
||||
if kdump_is_bond "$_dev"; then
|
||||
kdump_setup_bond "$_dev"
|
||||
elif kdump_is_team "$_dev"; then
|
||||
kdump_setup_team "$_dev"
|
||||
elif kdump_is_vlan "$_dev"; then
|
||||
kdump_setup_vlan "$_dev"
|
||||
else
|
||||
_mac=$(kdump_get_mac_addr $_dev)
|
||||
_kdumpdev=$(kdump_setup_ifname $_dev)
|
||||
echo -n " ifname=$_kdumpdev:$_mac" >> ${initdir}/etc/cmdline.d/41bridge.conf
|
||||
fi
|
||||
_brif+="$_kdumpdev,"
|
||||
done
|
||||
echo " bridge=$_netdev:$(echo $_brif | sed -e 's/,$//')" >> ${initdir}/etc/cmdline.d/41bridge.conf
|
||||
}
|
||||
|
||||
kdump_setup_bond() {
|
||||
local _netdev=$1
|
||||
local _dev _mac _slaves _kdumpdev
|
||||
for _dev in `cat /sys/class/net/$_netdev/bonding/slaves`; do
|
||||
_mac=$(kdump_get_perm_addr $_dev)
|
||||
_kdumpdev=$(kdump_setup_ifname $_dev)
|
||||
echo -n " ifname=$_kdumpdev:$_mac" >> ${initdir}/etc/cmdline.d/42bond.conf
|
||||
_slaves+="$_kdumpdev,"
|
||||
done
|
||||
echo -n " bond=$_netdev:$(echo $_slaves | sed 's/,$//')" >> ${initdir}/etc/cmdline.d/42bond.conf
|
||||
# Get bond options specified in ifcfg
|
||||
|
||||
source_ifcfg_file $_netdev
|
||||
|
||||
bondoptions="$(echo :$BONDING_OPTS | sed 's/\s\+/,/')"
|
||||
echo "$bondoptions" >> ${initdir}/etc/cmdline.d/42bond.conf
|
||||
}
|
||||
|
||||
kdump_setup_team() {
|
||||
local _netdev=$1
|
||||
local _dev _mac _slaves _kdumpdev
|
||||
for _dev in `teamnl $_netdev ports | awk -F':' '{print $2}'`; do
|
||||
_mac=$(kdump_get_perm_addr $_dev)
|
||||
_kdumpdev=$(kdump_setup_ifname $_dev)
|
||||
echo -n " ifname=$_kdumpdev:$_mac" >> ${initdir}/etc/cmdline.d/44team.conf
|
||||
_slaves+="$_kdumpdev,"
|
||||
done
|
||||
echo " team=$_netdev:$(echo $_slaves | sed -e 's/,$//')" >> ${initdir}/etc/cmdline.d/44team.conf
|
||||
#Buggy version teamdctl outputs to stderr!
|
||||
#Try to use the latest version of teamd.
|
||||
teamdctl "$_netdev" config dump > ${initdir}/tmp/$$-$_netdev.conf
|
||||
if [ $? -ne 0 ]
|
||||
then
|
||||
derror "teamdctl failed."
|
||||
exit 1
|
||||
fi
|
||||
inst_dir /etc/teamd
|
||||
inst_simple ${initdir}/tmp/$$-$_netdev.conf "/etc/teamd/$_netdev.conf"
|
||||
rm -f ${initdir}/tmp/$$-$_netdev.conf
|
||||
}
|
||||
|
||||
kdump_setup_vlan() {
|
||||
local _netdev=$1
|
||||
local _phydev="$(awk '/^Device:/{print $2}' /proc/net/vlan/"$_netdev")"
|
||||
local _netmac="$(kdump_get_mac_addr $_phydev)"
|
||||
local _kdumpdev
|
||||
|
||||
#Just support vlan over bond, it is not easy
|
||||
#to support all other complex setup
|
||||
if kdump_is_bridge "$_phydev"; then
|
||||
derror "Vlan over bridge is not supported!"
|
||||
exit 1
|
||||
elif kdump_is_team "$_phydev"; then
|
||||
derror "Vlan over team is not supported!"
|
||||
exit 1
|
||||
elif kdump_is_bond "$_phydev"; then
|
||||
kdump_setup_bond "$_phydev"
|
||||
echo " vlan=$_netdev:$_phydev" > ${initdir}/etc/cmdline.d/43vlan.conf
|
||||
else
|
||||
_kdumpdev="$(kdump_setup_ifname $_phydev)"
|
||||
echo " vlan=$_netdev:$_kdumpdev ifname=$_kdumpdev:$_netmac" > ${initdir}/etc/cmdline.d/43vlan.conf
|
||||
fi
|
||||
}
|
||||
|
||||
# setup s390 znet cmdline
|
||||
# $1: netdev name
|
||||
kdump_setup_znet() {
|
||||
local _options=""
|
||||
|
||||
source_ifcfg_file $1
|
||||
|
||||
for i in $OPTIONS; do
|
||||
_options=${_options},$i
|
||||
done
|
||||
echo rd.znet=${NETTYPE},${SUBCHANNELS}${_options} > ${initdir}/etc/cmdline.d/30znet.conf
|
||||
}
|
||||
|
||||
# Setup dracut to bringup a given network interface
|
||||
kdump_setup_netdev() {
|
||||
local _netdev=$1 _srcaddr=$2
|
||||
local _static _proto _ip_conf _ip_opts _ifname_opts
|
||||
|
||||
if [ "$(uname -m)" = "s390x" ]; then
|
||||
kdump_setup_znet $_netdev
|
||||
fi
|
||||
|
||||
_netmac=$(kdump_get_mac_addr $_netdev)
|
||||
_static=$(kdump_static_ip $_netdev $_srcaddr)
|
||||
if [ -n "$_static" ]; then
|
||||
_proto=none
|
||||
elif is_ipv6_address $_srcaddr; then
|
||||
_proto=either6
|
||||
else
|
||||
_proto=dhcp
|
||||
fi
|
||||
|
||||
_ip_conf="${initdir}/etc/cmdline.d/40ip.conf"
|
||||
_ip_opts=" ip=${_static}$(kdump_setup_ifname $_netdev):${_proto}"
|
||||
|
||||
# dracut doesn't allow duplicated configuration for same NIC, even they're exactly the same.
|
||||
# so we have to avoid adding duplicates
|
||||
# We should also check /proc/cmdline for existing ip=xx arg.
|
||||
# For example, iscsi boot will specify ip=xxx arg in cmdline.
|
||||
if [ ! -f $_ip_conf ] || ! grep -q $_ip_opts $_ip_conf &&\
|
||||
! grep -q "ip=[^[:space:]]*$_netdev" /proc/cmdline; then
|
||||
echo "$_ip_opts" >> $_ip_conf
|
||||
fi
|
||||
|
||||
if kdump_is_bridge "$_netdev"; then
|
||||
kdump_setup_bridge "$_netdev"
|
||||
elif kdump_is_bond "$_netdev"; then
|
||||
kdump_setup_bond "$_netdev"
|
||||
elif kdump_is_team "$_netdev"; then
|
||||
kdump_setup_team "$_netdev"
|
||||
elif kdump_is_vlan "$_netdev"; then
|
||||
kdump_setup_vlan "$_netdev"
|
||||
else
|
||||
_ifname_opts=" ifname=$(kdump_setup_ifname $_netdev):$(kdump_get_mac_addr $_netdev)"
|
||||
echo "$_ifname_opts" >> $_ip_conf
|
||||
fi
|
||||
|
||||
kdump_setup_dns "$_netdev"
|
||||
}
|
||||
|
||||
get_ip_route_field()
|
||||
{
|
||||
if `echo $1 | grep -q $2`; then
|
||||
echo ${1##*$2} | cut -d ' ' -f1
|
||||
fi
|
||||
}
|
||||
|
||||
#Function:kdump_install_net
|
||||
#$1: config values of net line in kdump.conf
|
||||
#$2: srcaddr of network device
|
||||
kdump_install_net() {
|
||||
local _server _netdev _srcaddr _route _serv_tmp
|
||||
local config_val="$1"
|
||||
|
||||
_server=$(get_remote_host $config_val)
|
||||
|
||||
if is_hostname $_server; then
|
||||
_serv_tmp=`getent ahosts $_server | grep -v : | head -n 1`
|
||||
if [ -z "$_serv_tmp" ]; then
|
||||
_serv_tmp=`getent ahosts $_server | head -n 1`
|
||||
fi
|
||||
_server=`echo $_serv_tmp | cut -d' ' -f1`
|
||||
fi
|
||||
|
||||
_route=`/sbin/ip -o route get to $_server 2>&1`
|
||||
[ $? != 0 ] && echo "Bad kdump location: $config_val" && exit 1
|
||||
|
||||
#the field in the ip output changes if we go to another subnet
|
||||
_srcaddr=$(get_ip_route_field "$_route" "src")
|
||||
_netdev=$(get_ip_route_field "$_route" "dev")
|
||||
|
||||
kdump_setup_netdev "${_netdev}" "${_srcaddr}"
|
||||
|
||||
#save netdev used for kdump as cmdline
|
||||
# Whoever calling kdump_install_net() is setting up the default gateway,
|
||||
# ie. bootdev/kdumpnic. So don't override the setting if calling
|
||||
# kdump_install_net() for another time. For example, after setting eth0 as
|
||||
# the default gate way for network dump, eth1 in the fence kdump path will
|
||||
# call kdump_install_net again and we don't want eth1 to be the default
|
||||
# gateway.
|
||||
if [ ! -f ${initdir}/etc/cmdline.d/60kdumpnic.conf ] &&
|
||||
[ ! -f ${initdir}/etc/cmdline.d/70bootdev.conf ]; then
|
||||
echo "kdumpnic=$(kdump_setup_ifname $_netdev)" > ${initdir}/etc/cmdline.d/60kdumpnic.conf
|
||||
echo "bootdev=$(kdump_setup_ifname $_netdev)" > ${initdir}/etc/cmdline.d/70bootdev.conf
|
||||
fi
|
||||
}
|
||||
|
||||
default_dump_target_install_conf()
|
||||
{
|
||||
local _target _fstype
|
||||
local _mntpoint _save_path
|
||||
|
||||
is_user_configured_dump_target && return
|
||||
|
||||
_save_path=$(get_option_value "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)
|
||||
|
||||
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)
|
||||
if $(is_fs_type_nfs $_fstype); then
|
||||
kdump_install_net "$_target"
|
||||
_fstype="nfs"
|
||||
else
|
||||
_target=$(kdump_to_udev_name $_target)
|
||||
fi
|
||||
|
||||
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
|
||||
if [ "$_mntpoint" != "/" ]; then
|
||||
_save_path=${_save_path##"$_mntpoint"}
|
||||
fi
|
||||
|
||||
#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
|
||||
}
|
||||
|
||||
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
|
||||
kdump_install_conf() {
|
||||
sed -ne '/^#/!p' /etc/kdump.conf > ${initdir}/tmp/$$-kdump.conf
|
||||
|
||||
while read config_opt config_val;
|
||||
do
|
||||
# remove inline comments after the end of a directive.
|
||||
config_val=$(strip_comments $config_val)
|
||||
case "$config_opt" in
|
||||
ext[234]|xfs|btrfs|minix|raw)
|
||||
sed -i -e "s#^$config_opt[[:space:]]\+$config_val#$config_opt $(kdump_to_udev_name $config_val)#" ${initdir}/tmp/$$-kdump.conf
|
||||
if is_atomic; then
|
||||
adjust_bind_mount_path "$config_val"
|
||||
fi
|
||||
;;
|
||||
ssh|nfs)
|
||||
kdump_install_net "$config_val"
|
||||
;;
|
||||
dracut_args)
|
||||
if [[ $(get_dracut_args_fstype "$config_val") = nfs* ]] ; then
|
||||
kdump_install_net "$(get_dracut_args_target "$config_val")"
|
||||
fi
|
||||
;;
|
||||
kdump_pre|kdump_post|extra_bins)
|
||||
dracut_install $config_val
|
||||
;;
|
||||
core_collector)
|
||||
dracut_install "${config_val%%[[:blank:]]*}"
|
||||
;;
|
||||
esac
|
||||
done < /etc/kdump.conf
|
||||
|
||||
default_dump_target_install_conf
|
||||
|
||||
kdump_configure_fence_kdump "${initdir}/tmp/$$-kdump.conf"
|
||||
inst "${initdir}/tmp/$$-kdump.conf" "/etc/kdump.conf"
|
||||
rm -f ${initdir}/tmp/$$-kdump.conf
|
||||
}
|
||||
|
||||
# Default sysctl parameters should suffice for kdump kernel.
|
||||
# Remove custom configurations sysctl.conf & sysctl.d/*
|
||||
remove_sysctl_conf() {
|
||||
|
||||
# As custom configurations like vm.min_free_kbytes can lead
|
||||
# to OOM issues in kdump kernel, avoid them
|
||||
rm -f "${initdir}/etc/sysctl.conf"
|
||||
rm -rf "${initdir}/etc/sysctl.d"
|
||||
rm -rf "${initdir}/run/sysctl.d"
|
||||
rm -rf "${initdir}/usr/lib/sysctl.d"
|
||||
}
|
||||
|
||||
kdump_iscsi_get_rec_val() {
|
||||
|
||||
local result
|
||||
|
||||
# The open-iscsi 742 release changed to using flat files in
|
||||
# /var/lib/iscsi.
|
||||
|
||||
result=$(/sbin/iscsiadm --show -m session -r ${1} | grep "^${2} = ")
|
||||
result=${result##* = }
|
||||
echo $result
|
||||
}
|
||||
|
||||
kdump_get_iscsi_initiator() {
|
||||
local _initiator
|
||||
local initiator_conf="/etc/iscsi/initiatorname.iscsi"
|
||||
|
||||
[ -f "$initiator_conf" ] || return 1
|
||||
|
||||
while read _initiator; do
|
||||
[ -z "${_initiator%%#*}" ] && continue # Skip comment lines
|
||||
|
||||
case $_initiator in
|
||||
InitiatorName=*)
|
||||
initiator=${_initiator#InitiatorName=}
|
||||
echo "rd.iscsi.initiator=${initiator}"
|
||||
return 0;;
|
||||
*) ;;
|
||||
esac
|
||||
done < ${initiator_conf}
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
# Figure out iBFT session according to session type
|
||||
is_ibft() {
|
||||
[ "$(kdump_iscsi_get_rec_val $1 "node.discovery_type")" = fw ]
|
||||
}
|
||||
|
||||
kdump_setup_iscsi_device() {
|
||||
local path=$1
|
||||
local tgt_name; local tgt_ipaddr;
|
||||
local username; local password; local userpwd_str;
|
||||
local username_in; local password_in; local userpwd_in_str;
|
||||
local netdev
|
||||
local srcaddr
|
||||
local idev
|
||||
local netroot_str ; local initiator_str;
|
||||
local netroot_conf="${initdir}/etc/cmdline.d/50iscsi.conf"
|
||||
local initiator_conf="/etc/iscsi/initiatorname.iscsi"
|
||||
|
||||
dinfo "Found iscsi component $1"
|
||||
|
||||
# Check once before getting explicit values, so we can bail out early,
|
||||
# e.g. in case of pure-hardware(all-offload) iscsi.
|
||||
if ! /sbin/iscsiadm -m session -r ${path} &>/dev/null ; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
if is_ibft ${path}; then
|
||||
return
|
||||
fi
|
||||
|
||||
tgt_name=$(kdump_iscsi_get_rec_val ${path} "node.name")
|
||||
tgt_ipaddr=$(kdump_iscsi_get_rec_val ${path} "node.conn\[0\].address")
|
||||
|
||||
# get and set username and password details
|
||||
username=$(kdump_iscsi_get_rec_val ${path} "node.session.auth.username")
|
||||
[ "$username" == "<empty>" ] && username=""
|
||||
password=$(kdump_iscsi_get_rec_val ${path} "node.session.auth.password")
|
||||
[ "$password" == "<empty>" ] && password=""
|
||||
username_in=$(kdump_iscsi_get_rec_val ${path} "node.session.auth.username_in")
|
||||
[ -n "$username" ] && userpwd_str="$username:$password"
|
||||
|
||||
# get and set incoming username and password details
|
||||
[ "$username_in" == "<empty>" ] && username_in=""
|
||||
password_in=$(kdump_iscsi_get_rec_val ${path} "node.session.auth.password_in")
|
||||
[ "$password_in" == "<empty>" ] && password_in=""
|
||||
|
||||
[ -n "$username_in" ] && userpwd_in_str=":$username_in:$password_in"
|
||||
|
||||
netdev=$(/sbin/ip route get to ${tgt_ipaddr} | \
|
||||
sed 's|.*dev \(.*\).*|\1|g')
|
||||
srcaddr=$(echo $netdev | awk '{ print $3; exit }')
|
||||
netdev=$(echo $netdev | awk '{ print $1; exit }')
|
||||
|
||||
kdump_setup_netdev $netdev $srcaddr
|
||||
|
||||
# prepare netroot= command line
|
||||
# FIXME: Do we need to parse and set other parameters like protocol, port
|
||||
# iscsi_iface_name, netdev_name, LUN etc.
|
||||
|
||||
if is_ipv6_address $tgt_ipaddr; then
|
||||
tgt_ipaddr="[$tgt_ipaddr]"
|
||||
fi
|
||||
netroot_str="netroot=iscsi:${userpwd_str}${userpwd_in_str}@$tgt_ipaddr::::$tgt_name"
|
||||
|
||||
[[ -f $netroot_conf ]] || touch $netroot_conf
|
||||
|
||||
# If netroot target does not exist already, append.
|
||||
if ! grep -q $netroot_str $netroot_conf; then
|
||||
echo $netroot_str >> $netroot_conf
|
||||
dinfo "Appended $netroot_str to $netroot_conf"
|
||||
fi
|
||||
|
||||
# Setup initator
|
||||
initiator_str=$(kdump_get_iscsi_initiator)
|
||||
[ $? -ne "0" ] && derror "Failed to get initiator name" && return 1
|
||||
|
||||
# If initiator details do not exist already, append.
|
||||
if ! grep -q "$initiator_str" $netroot_conf; then
|
||||
echo "$initiator_str" >> $netroot_conf
|
||||
dinfo "Appended "$initiator_str" to $netroot_conf"
|
||||
fi
|
||||
}
|
||||
|
||||
kdump_check_iscsi_targets () {
|
||||
# If our prerequisites are not met, fail anyways.
|
||||
type -P iscsistart >/dev/null || return 1
|
||||
|
||||
kdump_check_setup_iscsi() (
|
||||
local _dev
|
||||
_dev=$1
|
||||
|
||||
[[ -L /sys/dev/block/$_dev ]] || return
|
||||
cd "$(readlink -f /sys/dev/block/$_dev)"
|
||||
until [[ -d sys || -d iscsi_session ]]; do
|
||||
cd ..
|
||||
done
|
||||
[[ -d iscsi_session ]] && kdump_setup_iscsi_device "$PWD"
|
||||
)
|
||||
|
||||
[[ $hostonly ]] || [[ $mount_needs ]] && {
|
||||
for_each_host_dev_and_slaves_all kdump_check_setup_iscsi
|
||||
}
|
||||
}
|
||||
|
||||
# retrieves fence_kdump nodes from Pacemaker cluster configuration
|
||||
get_pcs_fence_kdump_nodes() {
|
||||
local nodes
|
||||
|
||||
# get cluster nodes from cluster cib, get interface and ip address
|
||||
nodelist=`pcs cluster cib | xmllint --xpath "/cib/status/node_state/@uname" -`
|
||||
|
||||
# nodelist is formed as 'uname="node1" uname="node2" ... uname="nodeX"'
|
||||
# we need to convert each to node1, node2 ... nodeX in each iteration
|
||||
for node in ${nodelist}; do
|
||||
# convert $node from 'uname="nodeX"' to 'nodeX'
|
||||
eval $node
|
||||
nodename=$uname
|
||||
# Skip its own node name
|
||||
if [ "$nodename" = `hostname` -o "$nodename" = `hostname -s` ]; then
|
||||
continue
|
||||
fi
|
||||
nodes="$nodes $nodename"
|
||||
done
|
||||
|
||||
echo $nodes
|
||||
}
|
||||
|
||||
# retrieves fence_kdump args from config file
|
||||
get_pcs_fence_kdump_args() {
|
||||
if [ -f $FENCE_KDUMP_CONFIG_FILE ]; then
|
||||
. $FENCE_KDUMP_CONFIG_FILE
|
||||
echo $FENCE_KDUMP_OPTS
|
||||
fi
|
||||
}
|
||||
|
||||
# setup fence_kdump in cluster
|
||||
# setup proper network and install needed files
|
||||
kdump_configure_fence_kdump () {
|
||||
local kdump_cfg_file=$1
|
||||
local nodes
|
||||
local args
|
||||
|
||||
if is_generic_fence_kdump; then
|
||||
nodes=$(get_option_value "fence_kdump_nodes")
|
||||
|
||||
elif is_pcs_fence_kdump; then
|
||||
nodes=$(get_pcs_fence_kdump_nodes)
|
||||
|
||||
# set appropriate options in kdump.conf
|
||||
echo "fence_kdump_nodes $nodes" >> ${kdump_cfg_file}
|
||||
|
||||
args=$(get_pcs_fence_kdump_args)
|
||||
if [ -n "$args" ]; then
|
||||
echo "fence_kdump_args $args" >> ${kdump_cfg_file}
|
||||
fi
|
||||
|
||||
else
|
||||
# fence_kdump not configured
|
||||
return 1
|
||||
fi
|
||||
|
||||
# setup network for each node
|
||||
for node in ${nodes}; do
|
||||
kdump_install_net $node
|
||||
done
|
||||
|
||||
dracut_install /etc/hosts
|
||||
dracut_install /etc/nsswitch.conf
|
||||
dracut_install $FENCE_KDUMP_SEND
|
||||
}
|
||||
|
||||
# Install a random seed used to feed /dev/urandom
|
||||
# By the time kdump service starts, /dev/uramdom is already fed by systemd
|
||||
kdump_install_random_seed() {
|
||||
local poolsize=`cat /proc/sys/kernel/random/poolsize`
|
||||
|
||||
if [ ! -d ${initdir}/var/lib/ ]; then
|
||||
mkdir -p ${initdir}/var/lib/
|
||||
fi
|
||||
|
||||
dd if=/dev/urandom of=${initdir}/var/lib/random-seed \
|
||||
bs=$poolsize count=1 2> /dev/null
|
||||
}
|
||||
|
||||
remove_cpu_online_rule() {
|
||||
local file=${initdir}/usr/lib/udev/rules.d/40-redhat.rules
|
||||
|
||||
sed -i '/SUBSYSTEM=="cpu"/d' $file
|
||||
}
|
||||
|
||||
install() {
|
||||
local arch
|
||||
|
||||
kdump_install_conf
|
||||
remove_sysctl_conf
|
||||
|
||||
# Onlining secondary cpus breaks kdump completely on KVM on Power hosts
|
||||
# Though we use maxcpus=1 by default but 40-redhat.rules will bring up all
|
||||
# possible cpus by default. (rhbz1270174 rhbz1266322)
|
||||
# Thus before we get the kernel fix and the systemd rule fix let's remove
|
||||
# the cpu online rule in kdump initramfs.
|
||||
arch=$(uname -m)
|
||||
if [[ "$arch" = "ppc64le" ]] || [[ "$arch" = "ppc64" ]]; then
|
||||
remove_cpu_online_rule
|
||||
fi
|
||||
|
||||
if is_ssh_dump_target; then
|
||||
kdump_install_random_seed
|
||||
fi
|
||||
dracut_install -o /etc/adjtime /etc/localtime
|
||||
inst "$moddir/monitor_dd_progress" "/kdumpscripts/monitor_dd_progress"
|
||||
chmod +x ${initdir}/kdumpscripts/monitor_dd_progress
|
||||
inst "/bin/grep" "/bin/grep"
|
||||
inst "/bin/cat" "/bin/cat"
|
||||
inst "/bin/rm" "/bin/rm"
|
||||
inst "/bin/dd" "/bin/dd"
|
||||
inst "/bin/tail" "/bin/tail"
|
||||
inst "/bin/date" "/bin/date"
|
||||
inst "/bin/sync" "/bin/sync"
|
||||
inst "/bin/cut" "/bin/cut"
|
||||
inst "/bin/head" "/bin/head"
|
||||
inst "/sbin/makedumpfile" "/sbin/makedumpfile"
|
||||
inst "/sbin/vmcore-dmesg" "/sbin/vmcore-dmesg"
|
||||
inst "/lib/kdump/kdump-lib.sh" "/lib/kdump-lib.sh"
|
||||
inst "/lib/kdump/kdump-lib-initramfs.sh" "/lib/kdump-lib-initramfs.sh"
|
||||
inst "$moddir/kdump.sh" "/usr/bin/kdump.sh"
|
||||
inst "$moddir/kdump-capture.service" "$systemdsystemunitdir/kdump-capture.service"
|
||||
ln_r "$systemdsystemunitdir/kdump-capture.service" "$systemdsystemunitdir/initrd.target.wants/kdump-capture.service"
|
||||
inst "$moddir/kdump-error-handler.sh" "/usr/bin/kdump-error-handler.sh"
|
||||
inst "$moddir/kdump-error-handler.service" "$systemdsystemunitdir/kdump-error-handler.service"
|
||||
# Replace existing emergency service and emergency target
|
||||
cp "$moddir/kdump-emergency.service" "$initdir/$systemdsystemunitdir/emergency.service"
|
||||
cp "$moddir/kdump-emergency.target" "$initdir/$systemdsystemunitdir/emergency.target"
|
||||
# Also redirect dracut-emergency to kdump error handler
|
||||
ln_r "$systemdsystemunitdir/emergency.service" "$systemdsystemunitdir/dracut-emergency.service"
|
||||
|
||||
# Check for all the devices and if any device is iscsi, bring up iscsi
|
||||
# target. Ideally all this should be pushed into dracut iscsi module
|
||||
# at some point of time.
|
||||
kdump_check_iscsi_targets
|
||||
|
||||
# For the lvm type target under kdump, in /etc/lvm/lvm.conf we can
|
||||
# safely replace "reserved_memory=XXXX"(default value is 8192) with
|
||||
# "reserved_memory=1024" to lower memory pressure under kdump. We do
|
||||
# it unconditionally here, if "/etc/lvm/lvm.conf" doesn't exist, it
|
||||
# actually does nothing.
|
||||
sed -i -e \
|
||||
's/\(^[[:space:]]*reserved_memory[[:space:]]*=\)[[:space:]]*[[:digit:]]*/\1 1024/' \
|
||||
${initdir}/etc/lvm/lvm.conf &>/dev/null
|
||||
|
||||
# Kdump turns out to require longer default systemd mount timeout
|
||||
# than 1st kernel(90s by default), we use default 300s for kdump.
|
||||
grep -r "^[[:space:]]*DefaultTimeoutStartSec=" ${initdir}/etc/systemd/system.conf* &>/dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
mkdir -p ${initdir}/etc/systemd/system.conf.d
|
||||
echo "[Manager]" > ${initdir}/etc/systemd/system.conf.d/kdump.conf
|
||||
echo "DefaultTimeoutStartSec=300s" >> ${initdir}/etc/systemd/system.conf.d/kdump.conf
|
||||
fi
|
||||
}
|
28
tools/kexec-tools/files/dracut-monitor_dd_progress
Normal file
28
tools/kexec-tools/files/dracut-monitor_dd_progress
Normal file
@ -0,0 +1,28 @@
|
||||
#!/bin/sh
|
||||
|
||||
SRC_FILE_MB=$1
|
||||
|
||||
while true
|
||||
do
|
||||
DD_PID=`pidof dd`
|
||||
if [ -n "$DD_PID" ]; then
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
while true
|
||||
do
|
||||
sleep 5
|
||||
if [ ! -d /proc/$DD_PID ]; then
|
||||
break
|
||||
fi
|
||||
|
||||
kill -s USR1 $DD_PID
|
||||
CURRENT_SIZE=`tail -n 1 /tmp/dd_progress_file | sed "s/[^0-9].*//g"`
|
||||
[ -n "$CURRENT_SIZE" ] && {
|
||||
CURRENT_MB=$(($CURRENT_SIZE / 1048576))
|
||||
echo -e "Copied $CURRENT_MB MB / $SRC_FILE_MB MB\r"
|
||||
}
|
||||
done
|
||||
|
||||
rm -f /tmp/dd_progress_file
|
22
tools/kexec-tools/files/kdump-dep-generator.sh
Normal file
22
tools/kexec-tools/files/kdump-dep-generator.sh
Normal file
@ -0,0 +1,22 @@
|
||||
#!/bin/sh
|
||||
|
||||
# More details about systemd generator:
|
||||
# http://www.freedesktop.org/wiki/Software/systemd/Generators/
|
||||
|
||||
. /usr/lib/kdump/kdump-lib.sh
|
||||
|
||||
# If invokded with no arguments for testing purpose, output to /tmp to
|
||||
# avoid overriding the existing.
|
||||
dest_dir="/tmp"
|
||||
|
||||
if [ -n "$1" ]; then
|
||||
dest_dir=$1
|
||||
fi
|
||||
|
||||
systemd_dir=/usr/lib/systemd/system
|
||||
kdump_wants=$dest_dir/kdump.service.wants
|
||||
|
||||
if is_ssh_dump_target; then
|
||||
mkdir -p $kdump_wants
|
||||
ln -sf $systemd_dir/network-online.target $kdump_wants/
|
||||
fi
|
91
tools/kexec-tools/files/kdump-in-cluster-environment.txt
Normal file
91
tools/kexec-tools/files/kdump-in-cluster-environment.txt
Normal file
@ -0,0 +1,91 @@
|
||||
Kdump-in-cluster-environment HOWTO
|
||||
|
||||
Introduction
|
||||
|
||||
Kdump is a kexec based crash dumping mechansim for Linux. This docuement
|
||||
illustrate how to configure kdump in cluster environment to allow the kdump
|
||||
crash recovery service complete without being preempted by traditional power
|
||||
fencing methods.
|
||||
|
||||
Overview
|
||||
|
||||
Kexec/Kdump
|
||||
|
||||
Details about Kexec/Kdump are available in Kexec-Kdump-howto file and will not
|
||||
be described here.
|
||||
|
||||
fence_kdump
|
||||
|
||||
fence_kdump is an I/O fencing agent to be used with the kdump crash recovery
|
||||
service. When the fence_kdump agent is invoked, it will listen for a message
|
||||
from the failed node that acknowledges that the failed node is executing the
|
||||
kdump crash kernel. Note that fence_kdump is not a replacement for traditional
|
||||
fencing methods. The fence_kdump agent can only detect that a node has entered
|
||||
the kdump crash recovery service. This allows the kdump crash recovery service
|
||||
complete without being preempted by traditional power fencing methods.
|
||||
|
||||
fence_kdump_send
|
||||
|
||||
fence_kdump_send is a utility used to send messages that acknowledge that the
|
||||
node itself has entered the kdump crash recovery service. The fence_kdump_send
|
||||
utility is typically run in the kdump kernel after a cluster node has
|
||||
encountered a kernel panic. Once the cluster node has entered the kdump crash
|
||||
recovery service, fence_kdump_send will periodically send messages to all
|
||||
cluster nodes. When the fence_kdump agent receives a valid message from the
|
||||
failed nodes, fencing is complete.
|
||||
|
||||
How to configure Pacemaker cluster environment:
|
||||
|
||||
If we want to use kdump in Pacemaker cluster environment, fence-agents-kdump
|
||||
should be installed in every nodes in the cluster. You can achieve this via
|
||||
the following command:
|
||||
|
||||
# yum install -y fence-agents-kdump
|
||||
|
||||
Next is to add kdump_fence to the cluster. Assuming that the cluster consists
|
||||
of three nodes, they are node1, node2 and node3, and use Pacemaker to perform
|
||||
resource management and pcs as cli configuration tool.
|
||||
|
||||
With pcs it is easy to add a stonith resource to the cluster. For example, add
|
||||
a stonith resource named mykdumpfence with fence type of fence_kdump via the
|
||||
following commands:
|
||||
|
||||
# pcs stonith create mykdumpfence fence_kdump \
|
||||
pcmk_host_check=static-list pcmk_host_list="node1 node2 node3"
|
||||
# pcs stonith update mykdumpfence pcmk_monitor_action=metadata --force
|
||||
# pcs stonith update mykdumpfence pcmk_status_action=metadata --force
|
||||
# pcs stonith update mykdumpfence pcmk_reboot_action=off --force
|
||||
|
||||
Then enable stonith
|
||||
# pcs property set stonith-enabled=true
|
||||
|
||||
How to configure kdump:
|
||||
|
||||
Actually there are two ways how to configure fence_kdump support:
|
||||
|
||||
1) Pacemaker based clusters
|
||||
If you have successfully configured fence_kdump in Pacemaker, there is
|
||||
no need to add some special configuration in kdump. So please refer to
|
||||
Kexec-Kdump-howto file for more information.
|
||||
|
||||
2) Generic clusters
|
||||
For other types of clusters there are two configuration options in
|
||||
kdump.conf which enables fence_kdump support:
|
||||
|
||||
fence_kdump_nodes <node(s)>
|
||||
Contains list of cluster node(s) separated by space to send
|
||||
fence_kdump notification to (this option is mandatory to enable
|
||||
fence_kdump)
|
||||
|
||||
fence_kdump_args <arg(s)>
|
||||
Command line arguments for fence_kdump_send (it can contain
|
||||
all valid arguments except hosts to send notification to)
|
||||
|
||||
These options will most probably be configured by your cluster software,
|
||||
so please refer to your cluster documentation how to enable fence_kdump
|
||||
support.
|
||||
|
||||
Please be aware that these two ways cannot be combined and 2) has precedence
|
||||
over 1). It means that if fence_kdump is configured using fence_kdump_nodes
|
||||
and fence_kdump_args options in kdump.conf, Pacemaker configuration is not
|
||||
used even if it exists.
|
165
tools/kexec-tools/files/kdump-lib-initramfs.sh
Executable file
165
tools/kexec-tools/files/kdump-lib-initramfs.sh
Executable file
@ -0,0 +1,165 @@
|
||||
# These variables and functions are useful in 2nd kernel
|
||||
|
||||
. /lib/kdump-lib.sh
|
||||
|
||||
KDUMP_PATH="/var/crash"
|
||||
CORE_COLLECTOR=""
|
||||
DEFAULT_CORE_COLLECTOR="makedumpfile -l --message-level 1 -d 31"
|
||||
DMESG_COLLECTOR="/sbin/vmcore-dmesg"
|
||||
DEFAULT_ACTION="systemctl reboot -f"
|
||||
DATEDIR=`date +%Y-%m-%d-%T`
|
||||
HOST_IP='127.0.0.1'
|
||||
DUMP_INSTRUCTION=""
|
||||
SSH_KEY_LOCATION="/root/.ssh/kdump_id_rsa"
|
||||
KDUMP_SCRIPT_DIR="/kdumpscripts"
|
||||
DD_BLKSIZE=512
|
||||
FINAL_ACTION="systemctl reboot -f"
|
||||
KDUMP_CONF="/etc/kdump.conf"
|
||||
KDUMP_PRE=""
|
||||
KDUMP_POST=""
|
||||
NEWROOT="/sysroot"
|
||||
|
||||
get_kdump_confs()
|
||||
{
|
||||
local config_opt config_val
|
||||
|
||||
while read config_opt config_val;
|
||||
do
|
||||
# remove inline comments after the end of a directive.
|
||||
config_val=$(strip_comments $config_val)
|
||||
case "$config_opt" in
|
||||
path)
|
||||
KDUMP_PATH="$config_val"
|
||||
;;
|
||||
core_collector)
|
||||
[ -n "$config_val" ] && CORE_COLLECTOR="$config_val"
|
||||
;;
|
||||
sshkey)
|
||||
if [ -f "$config_val" ]; then
|
||||
SSH_KEY_LOCATION=$config_val
|
||||
fi
|
||||
;;
|
||||
kdump_pre)
|
||||
KDUMP_PRE="$config_val"
|
||||
;;
|
||||
kdump_post)
|
||||
KDUMP_POST="$config_val"
|
||||
;;
|
||||
fence_kdump_args)
|
||||
FENCE_KDUMP_ARGS="$config_val"
|
||||
;;
|
||||
fence_kdump_nodes)
|
||||
FENCE_KDUMP_NODES="$config_val"
|
||||
;;
|
||||
default)
|
||||
case $config_val in
|
||||
shell)
|
||||
DEFAULT_ACTION="kdump_emergency_shell"
|
||||
;;
|
||||
reboot)
|
||||
DEFAULT_ACTION="systemctl reboot -f"
|
||||
;;
|
||||
halt)
|
||||
DEFAULT_ACTION="halt"
|
||||
;;
|
||||
poweroff)
|
||||
DEFAULT_ACTION="poweroff"
|
||||
;;
|
||||
dump_to_rootfs)
|
||||
DEFAULT_ACTION="dump_to_rootfs"
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
done < $KDUMP_CONF
|
||||
|
||||
if [ -z "$CORE_COLLECTOR" ]; then
|
||||
CORE_COLLECTOR="$DEFAULT_CORE_COLLECTOR"
|
||||
if is_ssh_dump_target || is_raw_dump_target; then
|
||||
CORE_COLLECTOR="$CORE_COLLECTOR -F"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# dump_fs <mount point| device>
|
||||
dump_fs()
|
||||
{
|
||||
|
||||
local _dev=$(findmnt -k -f -n -r -o SOURCE $1)
|
||||
local _mp=$(findmnt -k -f -n -r -o TARGET $1)
|
||||
|
||||
echo "kdump: dump target is $_dev"
|
||||
|
||||
if [ -z "$_mp" ]; then
|
||||
echo "kdump: error: Dump target $_dev is not mounted."
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Remove -F in makedumpfile case. We don't want a flat format dump here.
|
||||
[[ $CORE_COLLECTOR = *makedumpfile* ]] && CORE_COLLECTOR=`echo $CORE_COLLECTOR | sed -e "s/-F//g"`
|
||||
|
||||
echo "kdump: saving to $_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/"
|
||||
|
||||
mount -o remount,rw $_mp || return 1
|
||||
mkdir -p $_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR || return 1
|
||||
|
||||
save_vmcore_dmesg_fs ${DMESG_COLLECTOR} "$_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/"
|
||||
|
||||
echo "kdump: saving vmcore"
|
||||
$CORE_COLLECTOR /proc/vmcore $_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/vmcore-incomplete || return 1
|
||||
mv $_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/vmcore-incomplete $_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/vmcore
|
||||
sync
|
||||
|
||||
echo "kdump: saving vmcore complete"
|
||||
# improper kernel cmdline can cause the failure of echo, we can ignore this kind of failure
|
||||
return 0
|
||||
}
|
||||
|
||||
save_vmcore_dmesg_fs() {
|
||||
local _dmesg_collector=$1
|
||||
local _path=$2
|
||||
|
||||
echo "kdump: saving vmcore-dmesg.txt"
|
||||
$_dmesg_collector /proc/vmcore > ${_path}/vmcore-dmesg-incomplete.txt
|
||||
_exitcode=$?
|
||||
if [ $_exitcode -eq 0 ]; then
|
||||
mv ${_path}/vmcore-dmesg-incomplete.txt ${_path}/vmcore-dmesg.txt
|
||||
|
||||
# Make sure file is on disk. There have been instances where later
|
||||
# saving vmcore failed and system rebooted without sync and there
|
||||
# was no vmcore-dmesg.txt available.
|
||||
sync
|
||||
echo "kdump: saving vmcore-dmesg.txt complete"
|
||||
else
|
||||
echo "kdump: saving vmcore-dmesg.txt failed"
|
||||
fi
|
||||
}
|
||||
|
||||
dump_to_rootfs()
|
||||
{
|
||||
|
||||
echo "Kdump: trying to bring up rootfs device"
|
||||
systemctl start dracut-initqueue
|
||||
echo "Kdump: waiting for rootfs mount, will timeout after 90 seconds"
|
||||
systemctl start sysroot.mount
|
||||
|
||||
dump_fs $NEWROOT
|
||||
}
|
||||
|
||||
kdump_emergency_shell()
|
||||
{
|
||||
echo "PS1=\"kdump:\\\${PWD}# \"" >/etc/profile
|
||||
/bin/dracut-emergency
|
||||
rm -f /etc/profile
|
||||
}
|
||||
|
||||
do_default_action()
|
||||
{
|
||||
echo "Kdump: Executing default action $DEFAULT_ACTION"
|
||||
eval $DEFAULT_ACTION
|
||||
}
|
||||
|
||||
do_final_action()
|
||||
{
|
||||
eval $FINAL_ACTION
|
||||
}
|
520
tools/kexec-tools/files/kdump-lib.sh
Executable file
520
tools/kexec-tools/files/kdump-lib.sh
Executable file
@ -0,0 +1,520 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Kdump common variables and functions
|
||||
#
|
||||
|
||||
DEFAULT_PATH="/var/crash/"
|
||||
FENCE_KDUMP_CONFIG_FILE="/etc/sysconfig/fence_kdump"
|
||||
FENCE_KDUMP_SEND="/usr/libexec/fence_kdump_send"
|
||||
FADUMP_ENABLED_SYS_NODE="/sys/kernel/fadump_enabled"
|
||||
|
||||
is_fadump_capable()
|
||||
{
|
||||
# Check if firmware-assisted dump is enabled
|
||||
# if no, fallback to kdump check
|
||||
if [ -f $FADUMP_ENABLED_SYS_NODE ]; then
|
||||
rc=`cat $FADUMP_ENABLED_SYS_NODE`
|
||||
[ $rc -eq 1 ] && return 0
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
perror_exit() {
|
||||
echo $@ >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
perror() {
|
||||
echo $@ >&2
|
||||
}
|
||||
|
||||
is_ssh_dump_target()
|
||||
{
|
||||
grep -q "^ssh[[:blank:]].*@" /etc/kdump.conf
|
||||
}
|
||||
|
||||
is_nfs_dump_target()
|
||||
{
|
||||
grep -q "^nfs" /etc/kdump.conf || \
|
||||
[[ $(get_dracut_args_fstype "$(grep "^dracut_args .*\-\-mount" /etc/kdump.conf)") = nfs* ]]
|
||||
}
|
||||
|
||||
is_raw_dump_target()
|
||||
{
|
||||
grep -q "^raw" /etc/kdump.conf
|
||||
}
|
||||
|
||||
is_fs_type_nfs()
|
||||
{
|
||||
local _fstype=$1
|
||||
[ $_fstype = "nfs" ] || [ $_fstype = "nfs4" ] && return 0
|
||||
return 1
|
||||
}
|
||||
|
||||
is_fs_dump_target()
|
||||
{
|
||||
egrep -q "^ext[234]|^xfs|^btrfs|^minix" /etc/kdump.conf
|
||||
}
|
||||
|
||||
strip_comments()
|
||||
{
|
||||
echo $@ | sed -e 's/\(.*\)#.*/\1/'
|
||||
}
|
||||
|
||||
# Check if fence kdump is configured in Pacemaker cluster
|
||||
is_pcs_fence_kdump()
|
||||
{
|
||||
# no pcs or fence_kdump_send executables installed?
|
||||
type -P pcs > /dev/null || return 1
|
||||
[ -x $FENCE_KDUMP_SEND ] || return 1
|
||||
|
||||
# fence kdump not configured?
|
||||
(pcs cluster cib | grep 'type="fence_kdump"') &> /dev/null || return 1
|
||||
}
|
||||
|
||||
# Check if fence_kdump is configured using kdump options
|
||||
is_generic_fence_kdump()
|
||||
{
|
||||
[ -x $FENCE_KDUMP_SEND ] || return 1
|
||||
|
||||
grep -q "^fence_kdump_nodes" /etc/kdump.conf
|
||||
}
|
||||
|
||||
to_dev_name() {
|
||||
local dev="${1//\"/}"
|
||||
|
||||
case "$dev" in
|
||||
UUID=*)
|
||||
dev=`blkid -U "${dev#UUID=}"`
|
||||
;;
|
||||
LABEL=*)
|
||||
dev=`blkid -L "${dev#LABEL=}"`
|
||||
;;
|
||||
esac
|
||||
echo $dev
|
||||
}
|
||||
|
||||
kdump_get_persistent_dev() {
|
||||
local i _tmp _dev _lookup_dirs
|
||||
|
||||
_dev=$(udevadm info --query=name --name="$1" 2>/dev/null)
|
||||
[ -z "$_dev" ] && {
|
||||
perror_exit "Kernel dev name of $1 is not found."
|
||||
}
|
||||
|
||||
if [[ $2 = "raw" ]];then
|
||||
_lookup_dirs="/dev/mapper/* /dev/disk/by-id/* /dev/disk/by-path/*"
|
||||
else
|
||||
_lookup_dirs="/dev/mapper/* /dev/disk/by-uuid/* /dev/disk/by-id/*"
|
||||
fi
|
||||
|
||||
for i in $_lookup_dirs; do
|
||||
_tmp=$(udevadm info --query=name --name="$i" 2>/dev/null)
|
||||
if [ "$_tmp" = "$_dev" ]; then
|
||||
echo $i
|
||||
return
|
||||
fi
|
||||
done
|
||||
|
||||
perror "WARNING: Persistent device name of $1 not found. Using $1 as dump target name"
|
||||
echo $1
|
||||
}
|
||||
|
||||
is_user_configured_dump_target()
|
||||
{
|
||||
return $(is_mount_in_dracut_args || is_ssh_dump_target || is_nfs_dump_target || \
|
||||
is_raw_dump_target || is_fs_dump_target)
|
||||
}
|
||||
|
||||
get_user_configured_dump_disk()
|
||||
{
|
||||
local _target
|
||||
|
||||
_target=$(egrep "^ext[234]|^xfs|^btrfs|^minix|^raw" /etc/kdump.conf 2>/dev/null |awk '{print $2}')
|
||||
[ -n "$_target" ] && echo $_target && return
|
||||
|
||||
_target=$(get_dracut_args_target "$(grep "^dracut_args .*\-\-mount" /etc/kdump.conf)")
|
||||
[ -b "$_target" ] && echo $_target
|
||||
}
|
||||
|
||||
get_root_fs_device()
|
||||
{
|
||||
local _target
|
||||
_target=$(findmnt -k -f -n -o SOURCE /)
|
||||
[ -n "$_target" ] && echo $_target
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
get_save_path()
|
||||
{
|
||||
local _save_path=$(grep "^path" /etc/kdump.conf|awk '{print $2}')
|
||||
if [ -z "$_save_path" ]; then
|
||||
_save_path=$DEFAULT_PATH
|
||||
fi
|
||||
|
||||
echo $_save_path
|
||||
}
|
||||
|
||||
get_block_dump_target()
|
||||
{
|
||||
local _target _path
|
||||
|
||||
if is_ssh_dump_target || is_nfs_dump_target; then
|
||||
return
|
||||
fi
|
||||
|
||||
_target=$(get_user_configured_dump_disk)
|
||||
[ -n "$_target" ] && echo $(to_dev_name $_target) && return
|
||||
|
||||
# Get block device name from local save path
|
||||
_path=$(get_save_path)
|
||||
_target=$(get_target_from_path $_path)
|
||||
[ -b "$_target" ] && echo $(to_dev_name $_target)
|
||||
}
|
||||
|
||||
is_dump_to_rootfs()
|
||||
{
|
||||
grep "^default[[:space:]]dump_to_rootfs" /etc/kdump.conf >/dev/null
|
||||
}
|
||||
|
||||
get_default_action_target()
|
||||
{
|
||||
local _target
|
||||
|
||||
if is_dump_to_rootfs; then
|
||||
# Get rootfs device name
|
||||
_target=$(get_root_fs_device)
|
||||
[ -b "$_target" ] && echo $(to_dev_name $_target) && return
|
||||
# Then, must be nfs root
|
||||
echo "nfs"
|
||||
fi
|
||||
}
|
||||
|
||||
# Get kdump targets(including root in case of dump_to_rootfs).
|
||||
get_kdump_targets()
|
||||
{
|
||||
local _target _root
|
||||
local kdump_targets
|
||||
|
||||
_target=$(get_block_dump_target)
|
||||
if [ -n "$_target" ]; then
|
||||
kdump_targets=$_target
|
||||
elif is_ssh_dump_target; then
|
||||
kdump_targets="ssh"
|
||||
else
|
||||
kdump_targets="nfs"
|
||||
fi
|
||||
|
||||
# Add the root device if dump_to_rootfs is specified.
|
||||
_root=$(get_default_action_target)
|
||||
if [ -n "$_root" -a "$kdump_targets" != "$_root" ]; then
|
||||
kdump_targets="$kdump_targets $_root"
|
||||
fi
|
||||
|
||||
echo "$kdump_targets"
|
||||
}
|
||||
|
||||
|
||||
# findmnt uses the option "-v, --nofsroot" to exclusive the [/dir]
|
||||
# in the SOURCE column for bind-mounts, then if $_mntpoint equals to
|
||||
# $_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
|
||||
# /dev/mapper/atomicos-root[/ostree/deploy/rhel-atomic-host/var], if the
|
||||
# directory is bind mounted. The former part represents the device path, rest
|
||||
# part is the bind mounted directory which quotes by bracket "[]".
|
||||
get_bind_mount_directory()
|
||||
{
|
||||
local _mntpoint=$(findmnt $1 | tail -n 1 | awk '{print $2}')
|
||||
local _mntpoint_nofsroot=$(findmnt -v $1 | tail -n 1 | awk '{print $2}')
|
||||
|
||||
_mntpoint=${_mntpoint#*$_mntpoint_nofsroot}
|
||||
|
||||
_mntpoint=${_mntpoint#[}
|
||||
_mntpoint=${_mntpoint%]}
|
||||
|
||||
echo $_mntpoint
|
||||
}
|
||||
|
||||
get_mntpoint_from_path()
|
||||
{
|
||||
echo $(df $1 | tail -1 | awk '{print $NF}')
|
||||
}
|
||||
|
||||
get_target_from_path()
|
||||
{
|
||||
echo $(df $1 | tail -1 | awk '{print $1}')
|
||||
}
|
||||
|
||||
get_fs_type_from_target()
|
||||
{
|
||||
echo $(findmnt -k -f -n -r -o FSTYPE $1)
|
||||
}
|
||||
|
||||
# input: device path
|
||||
# output: the general mount point
|
||||
# find the general mount point, not the bind mounted point in atomic
|
||||
# As general system, Use the previous code
|
||||
#
|
||||
# ERROR and EXIT:
|
||||
# the device can be umounted the general mount point, if one of the mount point is bind mounted
|
||||
# For example:
|
||||
# mount /dev/sda /mnt/
|
||||
# mount -o bind /mnt/var /var
|
||||
# umount /mnt
|
||||
get_mntpoint_from_target()
|
||||
{
|
||||
if is_atomic; then
|
||||
for _mnt in $(findmnt -k -n -r -o TARGET $1)
|
||||
do
|
||||
if ! is_bind_mount $_mnt; then
|
||||
echo $_mnt
|
||||
return
|
||||
fi
|
||||
done
|
||||
|
||||
echo "Mount $1 firstly, without the bind mode" >&2
|
||||
exit 1
|
||||
else
|
||||
echo $(findmnt -k -f -n -r -o TARGET $1)
|
||||
fi
|
||||
}
|
||||
|
||||
# get_option_value <option_name>
|
||||
# retrieves value of option defined in kdump.conf
|
||||
get_option_value() {
|
||||
echo $(strip_comments `grep ^$1 /etc/kdump.conf | tail -1 | cut -d\ -f2-`)
|
||||
}
|
||||
|
||||
#This function compose a absolute path with the mount
|
||||
#point and the relative $SAVE_PATH.
|
||||
#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)
|
||||
_mnt="${_mnt}/$SAVE_PATH"
|
||||
|
||||
# strip the duplicated "/"
|
||||
echo "$_mnt" | tr -s /
|
||||
}
|
||||
|
||||
check_save_path_fs()
|
||||
{
|
||||
local _path=$1
|
||||
|
||||
if [ ! -d $_path ]; then
|
||||
perror_exit "Dump path $_path does not exist."
|
||||
fi
|
||||
}
|
||||
|
||||
is_atomic()
|
||||
{
|
||||
grep -q "ostree" /proc/cmdline
|
||||
}
|
||||
|
||||
is_ipv6_address()
|
||||
{
|
||||
echo $1 | grep -q ":"
|
||||
}
|
||||
|
||||
# get ip address or hostname from nfs/ssh config value
|
||||
get_remote_host()
|
||||
{
|
||||
local _config_val=$1
|
||||
|
||||
# ipv6 address in kdump.conf is around with "[]",
|
||||
# factor out the ipv6 address
|
||||
_config_val=${_config_val#*@}
|
||||
_config_val=${_config_val%:/*}
|
||||
_config_val=${_config_val#[}
|
||||
_config_val=${_config_val%]}
|
||||
echo $_config_val
|
||||
}
|
||||
|
||||
is_hostname()
|
||||
{
|
||||
local _hostname=`echo $1 | grep ":"`
|
||||
|
||||
if [ -n "$_hostname" ]; then
|
||||
return 1
|
||||
fi
|
||||
echo $1 | grep -q "[a-zA-Z]"
|
||||
}
|
||||
|
||||
# Copied from "/etc/sysconfig/network-scripts/network-functions"
|
||||
get_hwaddr()
|
||||
{
|
||||
if [ -f "/sys/class/net/${1}/address" ]; then
|
||||
awk '{ print toupper($0) }' < /sys/class/net/${1}/address
|
||||
elif [ -d "/sys/class/net/${1}" ]; then
|
||||
LC_ALL= LANG= ip -o link show ${1} 2>/dev/null | \
|
||||
awk '{ print toupper(gensub(/.*link\/[^ ]* ([[:alnum:]:]*).*/,
|
||||
"\\1", 1)); }'
|
||||
fi
|
||||
}
|
||||
|
||||
get_ifcfg_by_device()
|
||||
{
|
||||
grep -E -i -l "^[[:space:]]*DEVICE=\"*${1}\"*[[:space:]]*$" \
|
||||
/etc/sysconfig/network-scripts/ifcfg-* 2>/dev/null | head -1
|
||||
}
|
||||
|
||||
get_ifcfg_by_hwaddr()
|
||||
{
|
||||
grep -E -i -l "^[[:space:]]*HWADDR=\"*${1}\"*[[:space:]]*$" \
|
||||
/etc/sysconfig/network-scripts/ifcfg-* 2>/dev/null | head -1
|
||||
}
|
||||
|
||||
get_ifcfg_by_uuid()
|
||||
{
|
||||
grep -E -i -l "^[[:space:]]*UUID=\"*${1}\"*[[:space:]]*$" \
|
||||
/etc/sysconfig/network-scripts/ifcfg-* 2>/dev/null | head -1
|
||||
}
|
||||
|
||||
get_ifcfg_by_name()
|
||||
{
|
||||
grep -E -i -l "^[[:space:]]*NAME=\"*${1}\"*[[:space:]]*$" \
|
||||
/etc/sysconfig/network-scripts/ifcfg-* 2>/dev/null | head -1
|
||||
}
|
||||
|
||||
is_nm_running()
|
||||
{
|
||||
[ "$(LANG=C nmcli -t --fields running general status 2>/dev/null)" = "running" ]
|
||||
}
|
||||
|
||||
is_nm_handling()
|
||||
{
|
||||
LANG=C nmcli -t --fields device,state dev status 2>/dev/null \
|
||||
| grep -q "^\(${1}:connected\)\|\(${1}:connecting.*\)$"
|
||||
}
|
||||
|
||||
# $1: netdev name
|
||||
get_ifcfg_nmcli()
|
||||
{
|
||||
local nm_uuid nm_name
|
||||
local ifcfg_file
|
||||
|
||||
# Get the active nmcli config name of $1
|
||||
if is_nm_running && is_nm_handling "${1}" ; then
|
||||
# The configuration "uuid" and "name" generated by nm is wrote to
|
||||
# the ifcfg file as "UUID=<nm_uuid>" and "NAME=<nm_name>".
|
||||
nm_uuid=$(LANG=C nmcli -t --fields uuid,device c show --active 2>/dev/null \
|
||||
| grep "${1}" | head -1 | cut -d':' -f1)
|
||||
nm_name=$(LANG=C nmcli -t --fields name,device c show --active 2>/dev/null \
|
||||
| grep "${1}" | head -1 | cut -d':' -f1)
|
||||
ifcfg_file=$(get_ifcfg_by_uuid "${nm_uuid}")
|
||||
[ -z "${ifcfg_file}" ] && ifcfg_file=$(get_ifcfg_by_name "${nm_name}")
|
||||
fi
|
||||
|
||||
echo -n "${ifcfg_file}"
|
||||
}
|
||||
|
||||
# $1: netdev name
|
||||
get_ifcfg_legacy()
|
||||
{
|
||||
local ifcfg_file
|
||||
|
||||
ifcfg_file="/etc/sysconfig/network-scripts/ifcfg-${1}"
|
||||
[ -f "${ifcfg_file}" ] && echo -n "${ifcfg_file}" && return
|
||||
|
||||
ifcfg_file=$(get_ifcfg_by_name "${1}")
|
||||
[ -f "${ifcfg_file}" ] && echo -n "${ifcfg_file}" && return
|
||||
|
||||
local hwaddr=$(get_hwaddr "${1}")
|
||||
if [ -n "$hwaddr" ]; then
|
||||
ifcfg_file=$(get_ifcfg_by_hwaddr "${hwaddr}")
|
||||
[ -f "${ifcfg_file}" ] && echo -n "${ifcfg_file}" && return
|
||||
fi
|
||||
|
||||
ifcfg_file=$(get_ifcfg_by_device "${1}")
|
||||
|
||||
echo -n "${ifcfg_file}"
|
||||
}
|
||||
|
||||
# $1: netdev name
|
||||
# Return the ifcfg file whole name(including the path) of $1 if any.
|
||||
get_ifcfg_filename() {
|
||||
local ifcfg_file
|
||||
|
||||
ifcfg_file=$(get_ifcfg_nmcli "${1}")
|
||||
if [ -z "${ifcfg_file}" ]; then
|
||||
ifcfg_file=$(get_ifcfg_legacy "${1}")
|
||||
fi
|
||||
|
||||
echo -n "${ifcfg_file}"
|
||||
}
|
||||
|
||||
# returns 0 when omission of watchdog module is desired in dracut_args
|
||||
# returns 1 otherwise
|
||||
is_wdt_mod_omitted() {
|
||||
local dracut_args
|
||||
local ret=1
|
||||
|
||||
dracut_args=$(grep "^dracut_args" /etc/kdump.conf)
|
||||
[[ -z $dracut_args ]] && return $ret
|
||||
|
||||
eval set -- $dracut_args
|
||||
while :; do
|
||||
[[ -z $1 ]] && break
|
||||
case $1 in
|
||||
-o|--omit)
|
||||
echo $2 | grep -qw "watchdog"
|
||||
[[ $? == 0 ]] && ret=0
|
||||
break
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
return $ret
|
||||
}
|
||||
|
||||
# If "dracut_args" contains "--mount" information, use it
|
||||
# directly without any check(users are expected to ensure
|
||||
# its correctness).
|
||||
is_mount_in_dracut_args()
|
||||
{
|
||||
grep -q "^dracut_args .*\-\-mount" /etc/kdump.conf
|
||||
}
|
||||
|
||||
# If $1 contains dracut_args "--mount", return <filesystem type>
|
||||
get_dracut_args_fstype()
|
||||
{
|
||||
echo $1 | grep "\-\-mount" | sed "s/.*--mount .\(.*\)/\1/" | cut -d' ' -f3
|
||||
}
|
||||
|
||||
# If $1 contains dracut_args "--mount", return <device>
|
||||
get_dracut_args_target()
|
||||
{
|
||||
echo $1 | grep "\-\-mount" | sed "s/.*--mount .\(.*\)/\1/" | cut -d' ' -f1
|
||||
}
|
||||
|
||||
# Get currently loaded modules
|
||||
# sorted, and delimited by newline
|
||||
get_loaded_kernel_modules()
|
||||
{
|
||||
local modules=( )
|
||||
while read _module _size _used _used_by; do
|
||||
modules+=( "$_module" )
|
||||
done <<< "$(lsmod | sed -n '1!p')"
|
||||
printf '%s\n' "${modules[@]}" | sort
|
||||
}
|
163
tools/kexec-tools/files/kdump.conf
Normal file
163
tools/kexec-tools/files/kdump.conf
Normal file
@ -0,0 +1,163 @@
|
||||
# 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.
|
||||
#
|
||||
# Directives in this file are only applicable to the kdump initramfs, and have
|
||||
# no effect once the root filesystem is mounted and the normal init scripts are
|
||||
# processed.
|
||||
#
|
||||
# Currently, only one dump target and path can be specified. If the dumping to
|
||||
# the configured target fails, the default action which can be configured via
|
||||
# the "default" directive will be performed.
|
||||
#
|
||||
# Supported options:
|
||||
#
|
||||
# raw <partition>
|
||||
# - Will dd /proc/vmcore into <partition>.
|
||||
# Use persistent device names for partition devices,
|
||||
# such as /dev/vg/<devname>.
|
||||
#
|
||||
# nfs <nfs mount>
|
||||
# - Will mount nfs to <mnt>, and copy /proc/vmcore to
|
||||
# <mnt>/<path>/%HOST-%DATE/, supports DNS.
|
||||
#
|
||||
# ssh <user@server>
|
||||
# - Will scp /proc/vmcore to <user@server>:<path>/%HOST-%DATE/,
|
||||
# supports DNS.
|
||||
# NOTE: make sure the user has write permissions on the server.
|
||||
#
|
||||
# sshkey <path>
|
||||
# - Will use the sshkey to do ssh dump.
|
||||
# Specify the path of the ssh key to use when dumping
|
||||
# via ssh. The default value is /root/.ssh/kdump_id_rsa.
|
||||
#
|
||||
# <fs type> <partition>
|
||||
# - Will mount -t <fs type> <partition> <mnt>, and copy
|
||||
# /proc/vmcore to <mnt>/<path>/%DATE/.
|
||||
# NOTE: <partition> can be a device node, label or uuid.
|
||||
# It's recommended to use persistent device names
|
||||
# such as /dev/vg/<devname>.
|
||||
# Otherwise it's suggested to use label or uuid.
|
||||
#
|
||||
# path <path>
|
||||
# - "path" represents the file system path in which vmcore
|
||||
# will be saved. If a dump target is specified in
|
||||
# kdump.conf, then "path" is relative to the specified
|
||||
# dump target.
|
||||
#
|
||||
# Interpretation of "path" changes a bit if the user didn't
|
||||
# specify any dump target explicitly in kdump.conf. In this
|
||||
# case, "path" represents the absolute path from root. The
|
||||
# dump target and adjusted path are arrived at automatically
|
||||
# depending on what's mounted in the current system.
|
||||
#
|
||||
# Ignored for raw device dumps. If unset, will use the default
|
||||
# "/var/crash".
|
||||
#
|
||||
# core_collector <command> <options>
|
||||
# - This allows you to specify the command to copy
|
||||
# the vmcore. The default is makedumpfile, which on
|
||||
# some architectures can drastically reduce vmcore size.
|
||||
# See /sbin/makedumpfile --help for a list of options.
|
||||
# Note that the -i and -g options are not needed here,
|
||||
# as the initrd will automatically be populated with a
|
||||
# config file appropriate for the running kernel.
|
||||
# The default core_collector for raw/ssh dump is:
|
||||
# "makedumpfile -F -l --message-level 1 -d 31".
|
||||
# The default core_collector for other targets is:
|
||||
# "makedumpfile -l --message-level 1 -d 31".
|
||||
#
|
||||
# "makedumpfile -F" will create a flattened vmcore.
|
||||
# You need to use "makedumpfile -R" to rearrange the dump data to
|
||||
# a normal dumpfile readable with analysis tools. For example:
|
||||
# "makedumpfile -R vmcore < vmcore.flat".
|
||||
#
|
||||
# For core_collector format details, you can refer to
|
||||
# kexec-kdump-howto.txt or kdump.conf manpage.
|
||||
#
|
||||
# kdump_post <binary | script>
|
||||
# - This directive allows you to run a executable binary
|
||||
# or script after the vmcore dump process terminates.
|
||||
# The exit status of the current dump process is fed to
|
||||
# the executable binary or script as its first argument.
|
||||
#
|
||||
# kdump_pre <binary | script>
|
||||
# - Works like the "kdump_post" directive, but instead of running
|
||||
# after the dump process, runs immediately before it.
|
||||
# Exit status of this binary is interpreted as follows:
|
||||
# 0 - continue with dump process as usual
|
||||
# non 0 - reboot the system
|
||||
#
|
||||
# extra_bins <binaries | shell scripts>
|
||||
# - This directive allows you to specify additional binaries or
|
||||
# shell scripts to be included in the kdump initrd.
|
||||
# Generally they are useful in conjunction with a kdump_post
|
||||
# or kdump_pre binary or script which depends on these extra_bins.
|
||||
#
|
||||
# extra_modules <module(s)>
|
||||
# - This directive allows you to specify extra kernel modules
|
||||
# that you want to be loaded in the kdump initrd.
|
||||
# Multiple modules can be listed, separated by spaces, and any
|
||||
# dependent modules will automatically be included.
|
||||
#
|
||||
# default <reboot | halt | poweroff | shell | dump_to_rootfs>
|
||||
# - Action to perform in case dumping fails.
|
||||
# reboot: Reboot the system.
|
||||
# halt: Halt the system.
|
||||
# poweroff: Power down the system.
|
||||
# shell: Drop to a bash shell.
|
||||
# Exiting the shell reboots the system.
|
||||
# dump_to_rootfs: Dump vmcore to rootfs from initramfs context and
|
||||
# reboot. Useful when non-root dump target is specified.
|
||||
# The default option is "reboot".
|
||||
#
|
||||
# force_rebuild <0 | 1>
|
||||
# - By default, kdump initrd will only be rebuilt when necessary.
|
||||
# Specify 1 to force rebuilding kdump initrd every time when kdump
|
||||
# service starts.
|
||||
#
|
||||
# force_no_rebuild <0 | 1>
|
||||
# - By default, kdump initrd will be rebuilt when necessary.
|
||||
# Specify 1 to bypass rebuilding of kdump initrd.
|
||||
#
|
||||
# force_no_rebuild and force_rebuild options are mutually
|
||||
# exclusive and they should not be set to 1 simultaneously.
|
||||
#
|
||||
# override_resettable <0 | 1>
|
||||
# - Usually an unresettable block device can't be a dump target.
|
||||
# Specifying 1 when you want to dump even though the block
|
||||
# target is unresettable
|
||||
# By default, it is 0, which will not try dumping destined to fail.
|
||||
#
|
||||
# dracut_args <arg(s)>
|
||||
# - Pass extra dracut options when rebuilding kdump initrd.
|
||||
#
|
||||
# fence_kdump_args <arg(s)>
|
||||
# - Command line arguments for fence_kdump_send (it can contain
|
||||
# all valid arguments except hosts to send notification to).
|
||||
#
|
||||
# fence_kdump_nodes <node(s)>
|
||||
# - List of cluster node(s) except localhost, separated by spaces,
|
||||
# to send fence_kdump notifications to.
|
||||
# (this option is mandatory to enable fence_kdump).
|
||||
#
|
||||
|
||||
#raw /dev/vg/lv_kdump
|
||||
#ext4 /dev/vg/lv_kdump
|
||||
#ext4 LABEL=/boot
|
||||
#ext4 UUID=03138356-5e61-4ab3-b58e-27507ac41937
|
||||
#nfs my.server.com:/export/tmp
|
||||
#ssh user@my.server.com
|
||||
#sshkey /root/.ssh/kdump_id_rsa
|
||||
path /var/crash
|
||||
core_collector makedumpfile -l --message-level 1 -d 31
|
||||
#core_collector scp
|
||||
#kdump_post /var/crash/scripts/kdump-post.sh
|
||||
#kdump_pre /var/crash/scripts/kdump-pre.sh
|
||||
#extra_bins /usr/bin/lftp
|
||||
#extra_modules gfs2
|
||||
#default shell
|
||||
#force_rebuild 1
|
||||
#force_no_rebuild 1
|
||||
#dracut_args --omit-drivers "cfg80211 snd" --add-drivers "ext2 ext3"
|
||||
#fence_kdump_args -p 7410 -f auto -c 0 -i 10
|
||||
#fence_kdump_nodes node1 node2
|
344
tools/kexec-tools/files/kdump.conf.5
Normal file
344
tools/kexec-tools/files/kdump.conf.5
Normal file
@ -0,0 +1,344 @@
|
||||
.TH KDUMP.CONF 5 "07/23/2008" "kexec-tools"
|
||||
|
||||
.SH NAME
|
||||
kdump.conf \- configuration file for kdump kernel.
|
||||
|
||||
.SH DESCRIPTION
|
||||
|
||||
kdump.conf is a configuration file for the kdump kernel crash
|
||||
collection service.
|
||||
|
||||
kdump.conf provides post-kexec instructions to the kdump kernel. It is
|
||||
stored in the initrd file managed by the kdump service. If you change
|
||||
this file and do not want to reboot in order for the changes to take
|
||||
effect, restart the kdump service to rebuild the initrd.
|
||||
|
||||
For most configurations, you can simply review the examples provided
|
||||
in the stock /etc/kdump.conf.
|
||||
|
||||
.B NOTE:
|
||||
For filesystem dumps the dump target must be mounted before building
|
||||
kdump initramfs.
|
||||
|
||||
kdump.conf only affects the behavior of the initramfs. Please read the
|
||||
kdump operational flow section of kexec-kdump-howto.txt in the docs to better
|
||||
understand how this configuration file affects the behavior of kdump.
|
||||
|
||||
.SH OPTIONS
|
||||
|
||||
.B raw <partition>
|
||||
.RS
|
||||
Will dd /proc/vmcore into <partition>. Use persistent device names for
|
||||
partition devices, such as /dev/vg/<devname>.
|
||||
.RE
|
||||
|
||||
.B nfs <nfs mount>
|
||||
.RS
|
||||
Will mount nfs to <mnt>, and copy /proc/vmcore to <mnt>/<path>/%HOST-%DATE/,
|
||||
supports DNS. Note that a fqdn should be used as the server name in the
|
||||
mount point.
|
||||
.RE
|
||||
|
||||
.B ssh <user@server>
|
||||
.RS
|
||||
Will scp /proc/vmcore to <user@server>:<path>/%HOST-%DATE/,
|
||||
supports DNS. NOTE: make sure user has necessary write permissions on
|
||||
server and that a fqdn is used as the server name.
|
||||
.RE
|
||||
|
||||
.B sshkey <path>
|
||||
.RS
|
||||
Specify the path of the ssh key to use when dumping via ssh.
|
||||
The default value is /root/.ssh/kdump_id_rsa.
|
||||
.RE
|
||||
|
||||
.B <fs type> <partition>
|
||||
.RS
|
||||
Will mount -t <fs type> <partition> <mnt>, and copy /proc/vmcore to
|
||||
<mnt>/<path>/%DATE/. NOTE: <partition> can be a device node, label
|
||||
or uuid. It's recommended to use persistent device names such as
|
||||
/dev/vg/<devname>. Otherwise it's suggested to use label or uuid.
|
||||
.RE
|
||||
|
||||
.B path <path>
|
||||
.RS
|
||||
"path" represents the file system path in which vmcore will be saved.
|
||||
If a dump target is specified in kdump.conf, then "path" is relative to the
|
||||
specified dump target.
|
||||
.PP
|
||||
Interpretation of "path" changes a bit if the user didn't specify any dump
|
||||
target explicitly in kdump.conf. In this case, "path" represents the
|
||||
absolute path from root. The dump target and adjusted path are arrived
|
||||
at automatically depending on what's mounted in the current system.
|
||||
.PP
|
||||
Ignored for raw device dumps. If unset, will use the default "/var/crash".
|
||||
.RE
|
||||
|
||||
.B core_collector <command> <options>
|
||||
.RS
|
||||
This allows you to specify the command to copy the vmcore.
|
||||
The default is makedumpfile, which on some architectures can drastically reduce
|
||||
core file size. See /sbin/makedumpfile --help for a list of options.
|
||||
Note that the -i and -g options are not needed here, as the initrd
|
||||
will automatically be populated with a config file appropriate
|
||||
for the running kernel.
|
||||
.PP
|
||||
Note 1: About default core collector:
|
||||
The default core_collector for raw/ssh dump is:
|
||||
"makedumpfile -F -l --message-level 1 -d 31".
|
||||
The default core_collector for other targets is:
|
||||
"makedumpfile -l --message-level 1 -d 31".
|
||||
Even if core_collector option is commented out in kdump.conf, makedumpfile
|
||||
is the default core collector and kdump uses it internally.
|
||||
If one does not want makedumpfile as default core_collector, then they
|
||||
need to specify one using core_collector option to change the behavior.
|
||||
.PP
|
||||
Note 2: If "makedumpfile -F" is used then you will get a flattened format
|
||||
vmcore.flat, you will need to use "makedumpfile -R" to rearrange the
|
||||
dump data from standard input to a normal dumpfile (readable with analysis
|
||||
tools).
|
||||
ie. "makedumpfile -R vmcore < vmcore.flat"
|
||||
|
||||
.RE
|
||||
|
||||
.B kdump_post <binary | script>
|
||||
.RS
|
||||
This directive allows you to run a specified executable
|
||||
just after the vmcore dump process terminates. The exit
|
||||
status of the current dump process is fed to the kdump_post
|
||||
executable as its first argument($1). Executable can modify
|
||||
it to indicate the new exit status of succeeding dump process,
|
||||
.PP
|
||||
Note that scripts written for use with this directive must use
|
||||
the /bin/bash interpreter.
|
||||
.RE
|
||||
|
||||
.B kdump_pre <binary | script>
|
||||
.RS
|
||||
Works just like the "kdump_post" directive, but instead
|
||||
of running after the dump process, runs immediately
|
||||
before. Exit status of this binary is interpreted
|
||||
as follows:
|
||||
.PP
|
||||
0 - continue with dump process as usual
|
||||
.PP
|
||||
non 0 - reboot the system
|
||||
.PP
|
||||
Note that scripts written for this directive must use
|
||||
the /bin/bash interpreter.
|
||||
.RE
|
||||
|
||||
.B extra_bins <binaries | shell scripts>
|
||||
.RS
|
||||
This directive allows you to specify additional
|
||||
binaries or shell scripts you'd like to include in
|
||||
your kdump initrd. Generally only useful in
|
||||
conjunction with a kdump_post binary or script that
|
||||
relies on other binaries or scripts.
|
||||
.RE
|
||||
|
||||
.B extra_modules <module(s)>
|
||||
.RS
|
||||
This directive allows you to specify extra kernel
|
||||
modules that you want to be loaded in the kdump
|
||||
initrd, typically used to set up access to
|
||||
non-boot-path dump targets that might otherwise
|
||||
not be accessible in the kdump environment. Multiple
|
||||
modules can be listed, separated by spaces, and any
|
||||
dependent modules will automatically be included.
|
||||
.RE
|
||||
|
||||
.B default <reboot | halt | poweroff | shell | dump_to_rootfs>
|
||||
.RS
|
||||
Action to perform in case dumping to the intended target fails. The default is "reboot".
|
||||
reboot: Reboot the system (this is what most people will want, as it returns the system
|
||||
to a normal state). halt: Halt the system and lose the vmcore. poweroff: The system
|
||||
will be powered down. shell: Drop to a shell session inside the initramfs, from which
|
||||
you can manually perform additional recovery actions. Exiting this shell reboots the
|
||||
system. Note: kdump uses bash as the default shell. dump_to_rootfs: If non-root dump
|
||||
target is specified, the default action can be set as dump_to_rootfs. That means when
|
||||
dumping to target fails, dump vmcore to rootfs from initramfs context and reboot.
|
||||
.RE
|
||||
|
||||
.B force_rebuild <0 | 1>
|
||||
.RS
|
||||
By default, kdump initrd will only be rebuilt when necessary.
|
||||
Specify 1 to force rebuilding kdump initrd every time when kdump service starts.
|
||||
.RE
|
||||
|
||||
.B force_no_rebuild <0 | 1>
|
||||
.RS
|
||||
By default, kdump initrd will be rebuilt when necessary.
|
||||
Specify 1 to bypass rebuilding of kdump initrd.
|
||||
|
||||
.PP
|
||||
force_no_rebuild and force_rebuild options are mutually exclusive and
|
||||
they should not be set to 1 simultaneously.
|
||||
.RE
|
||||
|
||||
.B override_resettable <0 | 1>
|
||||
.RS
|
||||
Usually an unresettable block device can't be a dump target. Specifying 1 means
|
||||
that even though the block target is unresettable, the user wants to try dumping anyway.
|
||||
By default, it's set to 0, which will not try something destined to fail.
|
||||
.RE
|
||||
|
||||
|
||||
.B dracut_args <arg(s)>
|
||||
.RS
|
||||
Kdump uses dracut to generate initramfs for second kernel. This option
|
||||
allows a user to pass arguments to dracut directly.
|
||||
.RE
|
||||
|
||||
|
||||
.B fence_kdump_args <arg(s)>
|
||||
.RS
|
||||
Command line arguments for fence_kdump_send (it can contain all valid
|
||||
arguments except hosts to send notification to).
|
||||
.RE
|
||||
|
||||
|
||||
.B fence_kdump_nodes <node(s)>
|
||||
.RS
|
||||
List of cluster node(s) except localhost, separated by spaces, to send fence_kdump notification
|
||||
to (this option is mandatory to enable fence_kdump).
|
||||
.RE
|
||||
|
||||
|
||||
.SH DEPRECATED OPTIONS
|
||||
|
||||
.B net <nfs mount>|<user@server>
|
||||
.RS
|
||||
net option is replaced by nfs and ssh options. Use nfs or ssh options
|
||||
directly.
|
||||
.RE
|
||||
|
||||
.B options <module> <option list>
|
||||
.RS
|
||||
Use KDUMP_COMMANDLINE_APPEND in /etc/sysconfig/kdump to add module options as
|
||||
kernel command line parameters. For example, specify 'loop.max_loop=1' to limit
|
||||
maximum loop devices to 1.
|
||||
.RE
|
||||
|
||||
.B link_delay <seconds>
|
||||
.RS
|
||||
link_delay was used to wait for a network device to initialize before using it.
|
||||
Now dracut network module takes care of this issue automatically.
|
||||
.RE
|
||||
|
||||
.B disk_timeout <seconds>
|
||||
.RS
|
||||
Similar to link_delay, dracut ensures disks are ready before kdump uses them.
|
||||
.RE
|
||||
|
||||
.B debug_mem_level <0-3>
|
||||
.RS
|
||||
Turn on verbose debug output of kdump scripts regarding free/used memory at
|
||||
various points of execution. This feature has been
|
||||
moved to dracut now.
|
||||
Use KDUMP_COMMANDLINE_APPEND in /etc/sysconfig/kdump and
|
||||
append dracut cmdline param rd.memdebug=[0-3] to enable the debug output.
|
||||
|
||||
Higher level means more debugging output.
|
||||
.PP
|
||||
0 - no output
|
||||
.PP
|
||||
1 - partial /proc/meminfo
|
||||
.PP
|
||||
2 - /proc/meminfo
|
||||
.PP
|
||||
3 - /proc/meminfo + /proc/slabinfo
|
||||
.RE
|
||||
|
||||
.B blacklist <list of kernel modules>
|
||||
.RS
|
||||
blacklist option was recently being used to prevent loading modules in
|
||||
initramfs. General terminology for blacklist has been that module is
|
||||
present in initramfs but it is not actually loaded in kernel. Hence
|
||||
retaining blacklist option creates more confusing behavior. It has been
|
||||
deprecated.
|
||||
.PP
|
||||
Instead, use rd.driver.blacklist option on second kernel to blacklist
|
||||
a certain module. One can edit /etc/sysconfig/kdump.conf and edit
|
||||
KDUMP_COMMANDLINE_APPEND to pass kernel command line options. Refer
|
||||
to dracut.cmdline man page for more details on module blacklist option.
|
||||
.RE
|
||||
|
||||
.RE
|
||||
|
||||
.SH EXAMPLES
|
||||
Here are some examples for core_collector option:
|
||||
.PP
|
||||
Core collector command format depends on dump target type. Typically for
|
||||
filesystem (local/remote), core_collector should accept two arguments.
|
||||
First one is source file and second one is target file. For ex.
|
||||
.TP
|
||||
ex1.
|
||||
core_collector "cp --sparse=always"
|
||||
|
||||
Above will effectively be translated to:
|
||||
|
||||
cp --sparse=always /proc/vmcore <dest-path>/vmcore
|
||||
.TP
|
||||
ex2.
|
||||
core_collector "makedumpfile -l --message-level 1 -d 31"
|
||||
|
||||
Above will effectively be translated to:
|
||||
|
||||
makedumpfile -l --message-level 1 -d 31 /proc/vmcore <dest-path>/vmcore
|
||||
.PP
|
||||
For dump targets like raw and ssh, in general, core collector should expect
|
||||
one argument (source file) and should output the processed core on standard
|
||||
output (There is one exception of "scp", discussed later). This standard
|
||||
output will be saved to destination using appropriate commands.
|
||||
|
||||
raw dumps examples:
|
||||
.TP
|
||||
ex3.
|
||||
core_collector "cat"
|
||||
|
||||
Above will effectively be translated to.
|
||||
|
||||
cat /proc/vmcore | dd of=<target-device>
|
||||
.TP
|
||||
ex4.
|
||||
core_collector "makedumpfile -F -l --message-level 1 -d 31"
|
||||
|
||||
Above will effectively be translated to.
|
||||
|
||||
makedumpfile -F -l --message-level 1 -d 31 | dd of=<target-device>
|
||||
.PP
|
||||
ssh dumps examples
|
||||
.TP
|
||||
ex5.
|
||||
core_collector "cat"
|
||||
|
||||
Above will effectively be translated to.
|
||||
|
||||
cat /proc/vmcore | ssh <options> <remote-location> "dd of=path/vmcore"
|
||||
.TP
|
||||
ex6.
|
||||
core_collector "makedumpfile -F -l --message-level 1 -d 31"
|
||||
|
||||
Above will effectively be translated to.
|
||||
|
||||
makedumpfile -F -l --message-level 1 -d 31 | ssh <options> <remote-location> "dd of=path/vmcore"
|
||||
|
||||
There is one exception to standard output rule for ssh dumps. And that is
|
||||
scp. As scp can handle ssh destinations for file transfers, one can
|
||||
specify "scp" as core collector for ssh targets (no output on stdout).
|
||||
.TP
|
||||
ex7.
|
||||
core_collector "scp"
|
||||
|
||||
Above will effectively be translated to.
|
||||
|
||||
scp /proc/vmcore <user@host>:path/vmcore
|
||||
|
||||
.PP
|
||||
examples for other options please see
|
||||
.I /etc/kdump.conf
|
||||
|
||||
.SH SEE ALSO
|
||||
|
||||
kexec(8) mkdumprd(8) dracut.cmdline(7)
|
14
tools/kexec-tools/files/kdump.service
Normal file
14
tools/kexec-tools/files/kdump.service
Normal file
@ -0,0 +1,14 @@
|
||||
[Unit]
|
||||
Description=Crash recovery kernel arming
|
||||
After=network.target network-online.target remote-fs.target basic.target
|
||||
DefaultDependencies=no
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
ExecStart=/usr/bin/kdumpctl start
|
||||
ExecStop=/usr/bin/kdumpctl stop
|
||||
RemainAfterExit=yes
|
||||
StartLimitInterval=0
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
31
tools/kexec-tools/files/kdump.sysconfig
Normal file
31
tools/kexec-tools/files/kdump.sysconfig
Normal file
@ -0,0 +1,31 @@
|
||||
# Kernel Version string for the -kdump kernel, such as 2.6.13-1544.FC5kdump
|
||||
# If no version is specified, then the init script will try to find a
|
||||
# kdump kernel with the same version number as the running kernel.
|
||||
KDUMP_KERNELVER=""
|
||||
|
||||
# The kdump commandline is the command line that needs to be passed off to
|
||||
# the kdump kernel. This will likely match the contents of the grub kernel
|
||||
# line. For example:
|
||||
# KDUMP_COMMANDLINE="ro root=LABEL=/"
|
||||
# Dracut depends on proper root= options, so please 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=".
|
||||
# If a command line is not specified, the default will be taken from
|
||||
# /proc/cmdline
|
||||
KDUMP_COMMANDLINE=""
|
||||
|
||||
# This variable lets us remove arguments from the current kdump commandline
|
||||
# as taken from either KDUMP_COMMANDLINE above, or from /proc/cmdline
|
||||
# NOTE: some arguments such as crashkernel will always be removed
|
||||
KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug"
|
||||
|
||||
# This variable lets us append arguments to the current kdump commandline
|
||||
# after processed by KDUMP_COMMANDLINE_REMOVE
|
||||
KDUMP_COMMANDLINE_APPEND="irqpoll maxcpus=1 reset_devices"
|
||||
|
||||
# Any additional kexec arguments required. In most situations, this should
|
||||
# be left empty
|
||||
#
|
||||
# Example:
|
||||
# KEXEC_ARGS="--elf32-core-headers"
|
||||
KEXEC_ARGS=""
|
40
tools/kexec-tools/files/kdump.sysconfig.x86_64
Normal file
40
tools/kexec-tools/files/kdump.sysconfig.x86_64
Normal file
@ -0,0 +1,40 @@
|
||||
# Kernel Version string for the -kdump kernel, such as 2.6.13-1544.FC5kdump
|
||||
# If no version is specified, then the init script will try to find a
|
||||
# kdump kernel with the same version number as the running kernel.
|
||||
KDUMP_KERNELVER=""
|
||||
|
||||
# The kdump commandline is the command line that needs to be passed off to
|
||||
# the kdump kernel. This will likely match the contents of the grub kernel
|
||||
# line. For example:
|
||||
# KDUMP_COMMANDLINE="ro root=LABEL=/"
|
||||
# Dracut depends on proper root= options, so please 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=".
|
||||
# If a command line is not specified, the default will be taken from
|
||||
# /proc/cmdline
|
||||
KDUMP_COMMANDLINE=""
|
||||
|
||||
# This variable lets us remove arguments from the current kdump commandline
|
||||
# as taken from either KDUMP_COMMANDLINE above, or from /proc/cmdline
|
||||
# NOTE: some arguments such as crashkernel will always be removed
|
||||
KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug kaslr"
|
||||
|
||||
# This variable lets us append arguments to the current kdump commandline
|
||||
# after processed by KDUMP_COMMANDLINE_REMOVE
|
||||
KDUMP_COMMANDLINE_APPEND="irqpoll nr_cpus=1 reset_devices cgroup_disable=memory mce=off numa=off udev.children-max=2 panic=10 rootflags=nofail acpi_no_memhotplug transparent_hugepage=never nokaslr"
|
||||
|
||||
# Any additional kexec arguments required. In most situations, this should
|
||||
# be left empty
|
||||
#
|
||||
# Example:
|
||||
# KEXEC_ARGS="--elf32-core-headers"
|
||||
KEXEC_ARGS=""
|
||||
|
||||
#Where to find the boot image
|
||||
#KDUMP_BOOTDIR="/boot"
|
||||
|
||||
#What is the image type used for kdump
|
||||
KDUMP_IMG="vmlinuz"
|
||||
|
||||
#What is the images extension. Relocatable kernels don't have one
|
||||
KDUMP_IMG_EXT=""
|
1323
tools/kexec-tools/files/kdumpctl
Executable file
1323
tools/kexec-tools/files/kdumpctl
Executable file
File diff suppressed because it is too large
Load Diff
44
tools/kexec-tools/files/kdumpctl.8
Normal file
44
tools/kexec-tools/files/kdumpctl.8
Normal file
@ -0,0 +1,44 @@
|
||||
.TH KDUMPCTL 8 2015-07-13 kexec-tools
|
||||
|
||||
.SH NAME
|
||||
kdumpctl \- control interface for kdump
|
||||
|
||||
.SH SYNOPSIS
|
||||
.B kdumpctl
|
||||
.I COMMAND
|
||||
|
||||
.SH DESCRIPTION
|
||||
.B kdumpctl
|
||||
is used to check or control the kdump service.
|
||||
In most cases, you should use
|
||||
.B systemctl
|
||||
to start / stop / enable kdump service instead. However,
|
||||
.B kdumpctl
|
||||
provides more details for debug and a helper to setup ssh key authentication.
|
||||
|
||||
.SH COMMANDS
|
||||
.TP
|
||||
.I start
|
||||
Start the service.
|
||||
.TP
|
||||
.I stop
|
||||
Stop the service.
|
||||
.TP
|
||||
.I status
|
||||
Prints the current status of kdump service.
|
||||
It returns non-zero value if kdump is not operational.
|
||||
.TP
|
||||
.I restart
|
||||
Is equal to
|
||||
.I start; stop
|
||||
.TP
|
||||
.I propagate
|
||||
Helps to setup key authentication for ssh storage since it's
|
||||
impossible to use password authentication during kdump.
|
||||
.TP
|
||||
.I showmem
|
||||
Prints the size of reserved memory for crash kernel in megabytes.
|
||||
|
||||
.SH "SEE ALSO"
|
||||
.BR kdump.conf (5),
|
||||
.BR mkdumprd (8)
|
730
tools/kexec-tools/files/kexec-kdump-howto.txt
Normal file
730
tools/kexec-tools/files/kexec-kdump-howto.txt
Normal file
@ -0,0 +1,730 @@
|
||||
Kexec/Kdump HOWTO
|
||||
|
||||
Introduction
|
||||
|
||||
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
|
||||
is to ensure faster boot up and creation of reliable kernel vmcores for
|
||||
diagnostic purposes.
|
||||
|
||||
Overview
|
||||
|
||||
Kexec
|
||||
|
||||
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
|
||||
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.
|
||||
|
||||
Kdump
|
||||
|
||||
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
|
||||
not from the context of the crashed kernel. Kdump uses kexec to boot into
|
||||
a second kernel whenever system crashes. This second kernel, often called
|
||||
a capture kernel, boots with very little memory and captures the dump image.
|
||||
|
||||
The first kernel reserves a section of memory that the second kernel uses
|
||||
to boot. Kexec enables booting the capture kernel without going through BIOS
|
||||
hence contents of first kernel's memory are preserved, which is essentially
|
||||
the kernel crash dump.
|
||||
|
||||
Kdump is supported on the i686, x86_64, ia64 and ppc64 platforms. The
|
||||
standard kernel and capture kernel are one in the same on i686, x86_64,
|
||||
ia64 and 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
|
||||
|
||||
Now load a kernel with kexec:
|
||||
|
||||
# kver=`uname -r` # kexec -l /boot/vmlinuz-$kver
|
||||
--initrd=/boot/initrd-$kver.img \
|
||||
--command-line="`cat /proc/cmdline`"
|
||||
|
||||
NOTE: The above will boot you back into the kernel you're currently running,
|
||||
if you want to load a different kernel, substitute it in place of `uname -r`.
|
||||
|
||||
Now reboot your system, taking note that it should bypass the BIOS:
|
||||
|
||||
# reboot
|
||||
|
||||
|
||||
How to configure kdump:
|
||||
|
||||
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
|
||||
|
||||
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 reserve a chunk of memory for
|
||||
the capture kernel. With the help of grubby, it's very easy to append
|
||||
"crashkernel=128M" to the end of your kernel boot parameters. Note that the X
|
||||
values are such that X = the amount of memory to reserve for the capture kernel.
|
||||
And based on arch and system configuration, one might require more than 128M to
|
||||
be reserved for kdump. One need to experiment and test kdump, if 128M is not
|
||||
sufficient, try reserving more memory.
|
||||
|
||||
# grubby --args="crashkernel=128M" --update-kernel=/boot/vmlinuz-`uname -r`
|
||||
|
||||
Note that there is an alternative form in which to specify a crashkernel
|
||||
memory reservation, in the event that more control is needed over the size and
|
||||
placement of the reserved memory. The format is:
|
||||
|
||||
crashkernel=range1:size1[,range2:size2,...][@offset]
|
||||
|
||||
Where range<n> specifies a range of values that are matched against the amount
|
||||
of physical RAM present in the system, and the corresponding size<n> value
|
||||
specifies the amount of kexec memory to reserve. For example:
|
||||
|
||||
crashkernel=512M-2G:64M,2G-:128M
|
||||
|
||||
This line tells kexec to reserve 64M of ram if the system contains between
|
||||
512M and 2G of physical memory. If the system contains 2G or more of physical
|
||||
memory, 128M should be reserved.
|
||||
|
||||
You can also use the default crashkernel=auto to let kernel set the
|
||||
crashkernel size.
|
||||
|
||||
crashkernel=auto indicates a best effort estimation for usual use cases,
|
||||
however one still needs do a test to ensure that the kernel reserved
|
||||
memory size is enough.
|
||||
|
||||
NOTE:
|
||||
When a debug variant kernel is used as the capture kernel and the
|
||||
primary kernel was booted with 'crashkernel=auto' set in the bootargs,
|
||||
the capture kernel boot can fail.
|
||||
|
||||
A debug variant kernel usually is the same stable kernel with some
|
||||
debug options enabled which uses much more memory in the kdump kernel.
|
||||
Thus when you use 'crashkernel=auto', kdump kernel will likely run out
|
||||
of memory.
|
||||
|
||||
So it is not advisable to use a debug variant kernel as the capture
|
||||
kernel when primary kernel is booted with 'crashkernel=auto' set in
|
||||
bootargs.
|
||||
|
||||
After making said changes, reboot your system, so that the X MB of memory is
|
||||
left untouched by the normal system, reserved for the capture kernel. Take note
|
||||
that the output of 'free -m' will show X MB less memory than without this
|
||||
parameter, which is expected. You may be able to get by with less than 128M, but
|
||||
testing with only 64M has proven unreliable of late. On ia64, as much as 512M
|
||||
may be required.
|
||||
|
||||
Now that you've got that reserved memory region set up, you want to turn on
|
||||
the kdump init script:
|
||||
|
||||
# chkconfig kdump on
|
||||
|
||||
Then, start up kdump as well:
|
||||
|
||||
# systemctl start kdump.service
|
||||
|
||||
This should load your kernel-kdump image via kexec, leaving the system ready
|
||||
to capture a vmcore upon crashing. To test this out, 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 restarting into
|
||||
the kdump kernel. When the boot process gets to the point where it starts
|
||||
the kdump service, your vmcore should be copied out to disk (by default,
|
||||
in /var/crash/<YYYY-MM-DD-HH:MM>/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.
|
||||
|
||||
Dump Triggering methods:
|
||||
|
||||
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
|
||||
on your system, with the scripts enabled as described in the section above.
|
||||
|
||||
1) AltSysRq C
|
||||
|
||||
Kdump can be triggered with the combination of the 'Alt','SysRq' and 'C'
|
||||
keyboard keys. Please refer to the following link for more details:
|
||||
|
||||
http://kbase.redhat.com/faq/FAQ_43_5559.shtm
|
||||
|
||||
In addition, on PowerPC boxes, Kdump can also be triggered via Hardware
|
||||
Management Console(HMC) using 'Ctrl', 'O' and 'C' keyboard keys.
|
||||
|
||||
2) NMI_WATCHDOG
|
||||
|
||||
In case a machine has a hard hang, it is quite possible that it does not
|
||||
respond to keyboard interrupts. As a result 'Alt-SysRq' keys will not help
|
||||
trigger a dump. In such scenarios Nmi Watchdog feature can prove to be useful.
|
||||
The following link has more details on configuring Nmi watchdog option.
|
||||
|
||||
http://kbase.redhat.com/faq/FAQ_85_9129.shtm
|
||||
|
||||
Once this feature has been enabled in the kernel, any lockups will result in an
|
||||
OOPs message to be generated, followed by Kdump being triggered.
|
||||
|
||||
3) 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
|
||||
|
||||
This is enabled by default on RHEL5.
|
||||
|
||||
4) NMI(Non maskable interrupt) button
|
||||
|
||||
In cases where the system is in a hung state, and is not accepting keyboard
|
||||
interrupts, using NMI button for triggering Kdump can be very useful. NMI
|
||||
button is present on most of the newer x86 and x86_64 machines. Please refer
|
||||
to the User guides/manuals to locate the button, though in most occasions it
|
||||
is not very well documented. In most cases it is hidden behind a small hole
|
||||
on the front or back panel of the machine. You could use a toothpick or some
|
||||
other non-conducting probe to press the button.
|
||||
|
||||
For example, on the IBM X series 366 machine, the NMI button is located behind
|
||||
a small hole on the bottom center of the rear panel.
|
||||
|
||||
To enable this method of dump triggering using NMI button, you will need to set
|
||||
the 'unknown_nmi_panic' option as follows:
|
||||
|
||||
# echo 1 > /proc/sys/kernel/unknown_nmi_panic
|
||||
|
||||
5) 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.
|
||||
|
||||
5.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
|
||||
Kdump 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
|
||||
|
||||
5.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:
|
||||
|
||||
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
|
||||
locations, including a raw disk partition, a dedicated file system, an NFS
|
||||
mounted file system, or a remote system via ssh/scp. Additional options
|
||||
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
|
||||
(so as to produce smaller, more manageable, vmcore files).
|
||||
|
||||
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
|
||||
dumping to a file system that has become corrupted. The raw disk partition and
|
||||
dedicated file system options allow you to still dump to the local system,
|
||||
but without having to remount your possibly corrupted file system(s),
|
||||
thereby decreasing the chance a vmcore won't be captured. Dumping to an
|
||||
NFS server or remote system via ssh/scp also has this advantage, as well
|
||||
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
|
||||
these configurations could present problems if your network is unreliable.
|
||||
|
||||
Advanced setups are configured via modifications to /etc/kdump.conf,
|
||||
which out of the box, is fairly well documented itself. Any alterations to
|
||||
/etc/kdump.conf should be followed by a restart of the kdump service, so
|
||||
the changes can be incorporated in the kdump initrd. Restarting the kdump
|
||||
service is as simple as '/sbin/systemctl restart kdump.service'.
|
||||
|
||||
|
||||
Note that kdump.conf is used as a configuration mechanism for capturing dump
|
||||
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
|
||||
/etc/kdump.conf is only applicable to capture recorded in the initramfs. If
|
||||
for any reason the init process is started on the root file system, only a
|
||||
simple copying of the vmcore from /proc/vmcore to /var/crash/$DATE/vmcore will
|
||||
be preformed.
|
||||
|
||||
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
|
||||
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
|
||||
for creating dump directory and will move it back to read-only afterwards.
|
||||
|
||||
Raw partition
|
||||
|
||||
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
|
||||
/dev/vg/lv_kdump is left unformatted, kdump.conf can be configured with
|
||||
'raw /dev/vg/lv_kdump', and the vmcore file will be copied via dd directly
|
||||
onto partition /dev/vg/lv_kdump. Restart the kdump service via
|
||||
'/sbin/systemctl restart kdump.service' to commit this change to your kdump
|
||||
initrd. Dump target should be persistent device name, such as lvm or device
|
||||
mapper canonical name.
|
||||
|
||||
Dedicated file system
|
||||
|
||||
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
|
||||
of memory in the system. Assuming it should be at least as large as the
|
||||
amount of memory in the system. Assuming /dev/vg/lv_kdump has been
|
||||
formatted ext4, specify 'ext4 /dev/vg/lv_kdump' in kdump.conf, and a
|
||||
vmcore file will be copied onto the file system after it has been mounted.
|
||||
Dumping to a dedicated partition has the advantage that you can dump multiple
|
||||
vmcores to the file system, space permitting, without overwriting previous ones,
|
||||
as would be the case in a raw partition setup. Restart the kdump service via
|
||||
'/sbin/systemctl restart kdump.service' to commit this change to
|
||||
your kdump initrd. Note that for local file systems ext4 and ext2 are
|
||||
supported as dumpable targets. Kdump will not prevent you from specifying
|
||||
other filesystems, and they will most likely work, but their operation
|
||||
cannot be guaranteed. for instance specifying a vfat filesystem or msdos
|
||||
filesystem will result in a successful load of the kdump service, but during
|
||||
crash recovery, the dump will fail if the system has more than 2GB of memory
|
||||
(since vfat and msdos filesystems do not support more than 2GB files).
|
||||
Be careful of your filesystem selection when using this target.
|
||||
|
||||
It is recommended to use persistent device names or UUID/LABEL for file system
|
||||
dumps. One example of persistent device is /dev/vg/<devname>.
|
||||
|
||||
NFS mount
|
||||
|
||||
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
|
||||
the kdump initial ramdisk are done as root, and to write out a vmcore file,
|
||||
we obviously must be able to write to the NFS mount. Configuring an NFS
|
||||
server is outside the scope of this document, but either the no_root_squash
|
||||
or anonuid options on the NFS server side are likely of interest to permit
|
||||
the kdump initrd operations write to the NFS mount as root.
|
||||
|
||||
Assuming your're exporting /dump on the machine nfs-server.example.com,
|
||||
once the mount is properly configured, specify it in kdump.conf, via
|
||||
'nfs nfs-server.example.com:/dump'. The server portion can be specified either
|
||||
by host name or IP address. Following a system crash, the kdump initrd will
|
||||
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
|
||||
to your kdump initrd.
|
||||
|
||||
Special mount via "dracut_args"
|
||||
|
||||
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
|
||||
via "dracut_args", kdump will build it as the mount target without doing any
|
||||
validation (mounting or checking like mount options, fs size, save path, etc),
|
||||
so you must test it to ensure all the correctness. You cannot use other targets
|
||||
in /etc/kdump.conf if you use "--mount" in "dracut_args". You also cannot specify
|
||||
mutliple "--mount" targets via "dracut_args".
|
||||
|
||||
One use case of "--mount" in "dracut_args" is you do not want to mount dump target
|
||||
before kdump service startup, for example, to reduce the burden of the shared nfs
|
||||
server. Such as the example below:
|
||||
dracut_args --mount "192.168.1.1:/share /mnt/test nfs4 defaults"
|
||||
|
||||
NOTE:
|
||||
- <mountpoint> must be specified as an absolute path.
|
||||
|
||||
Remote system via ssh/scp
|
||||
|
||||
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
|
||||
for ssh/scp dumping, adding a config line of 'ssh user@server', where 'user'
|
||||
can be any user on the target system you choose, and 'server' is the host
|
||||
name or IP address of the target system. Using a dedicated, restricted user
|
||||
account on the target system is recommended, as there will be keyless ssh
|
||||
access to this account.
|
||||
|
||||
Once kdump.conf is appropriately configured, issue the command
|
||||
'kdumpctl propagate' to automatically set up the ssh host keys and transmit
|
||||
the necessary bits to the target server. You'll have to type in 'yes'
|
||||
to accept the host key for your targer server if this is the first time
|
||||
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
|
||||
'/sbin/systemctl restart kdump.service' to commit this change to your kdump initrd.
|
||||
|
||||
Path
|
||||
====
|
||||
"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
|
||||
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.
|
||||
|
||||
Interpretation of path changes a bit if user has not specified a dump
|
||||
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
|
||||
kdump kernel under /boot according to /proc/cmdline. E.g we execute below
|
||||
command and get an output:
|
||||
cat /proc/cmdline
|
||||
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
|
||||
user if kdump kernel is put in a different directory.
|
||||
|
||||
Kdump Post-Capture Executable
|
||||
|
||||
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
|
||||
the capture process, which can be used to trigger different actions from
|
||||
within your post-capture executable.
|
||||
|
||||
Kdump Pre-Capture Executable
|
||||
|
||||
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:
|
||||
0 - continue with dump process as usual
|
||||
non 0 - reboot the system
|
||||
|
||||
Extra Binaries
|
||||
|
||||
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
|
||||
will be included in your kdump initrd, along with all dependent libraries.
|
||||
This may be particularly useful for those running post-capture scripts that
|
||||
rely on other binaries.
|
||||
|
||||
Extra Modules
|
||||
|
||||
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
|
||||
storage device, such as an iscsi target disk or clustered file system, you may
|
||||
need to manually specify additional kernel modules to load into your kdump
|
||||
initrd.
|
||||
|
||||
Default action
|
||||
==============
|
||||
Default action specifies what to do when dump to configured dump target
|
||||
fails. By default, default action is "reboot" and that is system reboots
|
||||
if attempt to save dump to dump target fails.
|
||||
|
||||
There are other default actions available though.
|
||||
|
||||
- dump_to_rootfs
|
||||
This option tries to mount root and save dump on root filesystem
|
||||
in a path specified by "path". This option will generally make
|
||||
sense when dump target is not root filesystem. For example, if
|
||||
dump is being saved over network using "ssh" then one can specify
|
||||
default to "dump_to_rootfs" to try saving dump to root filesystem
|
||||
if dump over network fails.
|
||||
|
||||
- shell
|
||||
Drop into a shell session inside initramfs.
|
||||
- halt
|
||||
Halt system after failure
|
||||
- poweroff
|
||||
Poweroff system after failure.
|
||||
|
||||
Compression and filtering
|
||||
|
||||
The 'core_collector' parameter in kdump.conf allows you to specify a custom
|
||||
dump capture method. The most common alternate method is makedumpfile, which
|
||||
is a dump filtering and compression utility provided with kexec-tools. On
|
||||
some architectures, it can drastically reduce the size of your vmcore files,
|
||||
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',
|
||||
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
|
||||
of). Note that use of makedumpfile requires that the kernel-debuginfo package
|
||||
corresponding with your running kernel be installed.
|
||||
|
||||
Core collector command format depends on dump target type. Typically for
|
||||
filesystem (local/remote), core_collector should accept two arguments.
|
||||
First one is source file and second one is target file. For ex.
|
||||
|
||||
ex1.
|
||||
---
|
||||
core_collector "cp --sparse=always"
|
||||
|
||||
Above will effectively be translated to:
|
||||
|
||||
cp --sparse=always /proc/vmcore <dest-path>/vmcore
|
||||
|
||||
ex2.
|
||||
---
|
||||
core_collector "makedumpfile -l --message-level 1 -d 31"
|
||||
|
||||
Above will effectively be translated to:
|
||||
|
||||
makedumpfile -l --message-level 1 -d 31 /proc/vmcore <dest-path>/vmcore
|
||||
|
||||
|
||||
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
|
||||
output (There is one exception of "scp", discussed later). This standard
|
||||
output will be saved to destination using appropriate commands.
|
||||
|
||||
raw dumps core_collector examples:
|
||||
---------
|
||||
ex3.
|
||||
---
|
||||
core_collector "cat"
|
||||
|
||||
Above will effectively be translated to.
|
||||
|
||||
cat /proc/vmcore | dd of=<target-device>
|
||||
|
||||
ex4.
|
||||
---
|
||||
core_collector "makedumpfile -F -l --message-level 1 -d 31"
|
||||
|
||||
Above will effectively be translated to.
|
||||
|
||||
makedumpfile -F -l --message-level 1 -d 31 | dd of=<target-device>
|
||||
|
||||
ssh dumps core_collector examples:
|
||||
---------
|
||||
ex5.
|
||||
---
|
||||
core_collector "cat"
|
||||
|
||||
Above will effectively be translated to.
|
||||
|
||||
cat /proc/vmcore | ssh <options> <remote-location> "dd of=path/vmcore"
|
||||
|
||||
ex6.
|
||||
---
|
||||
core_collector "makedumpfile -F -l --message-level 1 -d 31"
|
||||
|
||||
Above will effectively be translated to.
|
||||
|
||||
makedumpfile -F -l --message-level 1 -d 31 | ssh <options> <remote-location> "dd of=path/vmcore"
|
||||
|
||||
There is one exception to standard output rule for ssh dumps. And that is
|
||||
scp. As scp can handle ssh destinations for file transfers, one can
|
||||
specify "scp" as core collector for ssh targets (no output on stdout).
|
||||
|
||||
ex7.
|
||||
----
|
||||
core_collector "scp"
|
||||
|
||||
Above will effectively be translated to.
|
||||
|
||||
scp /proc/vmcore <user@host>:path/vmcore
|
||||
|
||||
About default core collector
|
||||
----------------------------
|
||||
Default core_collector for ssh/raw dump is:
|
||||
"makedumpfile -F -l --message-level 1 -d 31".
|
||||
Default core_collector for other targets is:
|
||||
"makedumpfile -l --message-level 1 -d 31".
|
||||
|
||||
Even if core_collector option is commented out in kdump.conf, makedumpfile
|
||||
is default core collector and kdump uses it internally.
|
||||
|
||||
If one does not want makedumpfile as default core_collector, then they
|
||||
need to specify one using core_collector option to change the behavior.
|
||||
|
||||
Note: If "makedumpfile -F" is used then you will get a flattened format
|
||||
vmcore.flat, you will need to use "makedumpfile -R" to rearrange the
|
||||
dump data from stdard input to a normal dumpfile (readable with analysis
|
||||
tools).
|
||||
For example: "makedumpfile -R vmcore < vmcore.flat"
|
||||
|
||||
Caveats:
|
||||
|
||||
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
|
||||
have X running, console video will be garbled when a kernel is booted via
|
||||
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.
|
||||
|
||||
|
||||
Notes on resetting video:
|
||||
|
||||
Video is a notoriously difficult issue with kexec. Video cards contain ROM code
|
||||
that controls their initial configuration and setup. This code is nominally
|
||||
accessed and executed from the Bios, and otherwise not safely executable. Since
|
||||
the purpose of kexec is to reboot the system without re-executing the Bios, it
|
||||
is rather difficult if not impossible to reset video cards with kexec. The
|
||||
result is, that if a system crashes while running in a graphical mode (i.e.
|
||||
running X), the screen may appear to become 'frozen' while the dump capture is
|
||||
taking place. A serial console will of course reveal that the system is
|
||||
operating and capturing a vmcore image, but a casual observer will see the
|
||||
system as hung until the dump completes and a true reboot is executed.
|
||||
|
||||
There are two possiblilties to work around this issue. One is by adding
|
||||
--reset-vga to the kexec command line options in /etc/sysconfig/kdump. This
|
||||
tells kdump to write some reasonable default values to the video card register
|
||||
file, in the hopes of returning it to a text mode such that boot messages are
|
||||
visible on the screen. It does not work with all video cards however.
|
||||
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,
|
||||
which can blank the screen prior to the start of a dump capture.
|
||||
|
||||
Notes on rootfs mount:
|
||||
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.
|
||||
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.
|
||||
|
||||
Notes on watchdog module handling:
|
||||
|
||||
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
|
||||
being kicked in second kernel. Otherwise, we might face watchdog reboot
|
||||
when vmcore is being saved. When dracut watchdog module is enabled, it
|
||||
installs kernel watchdog module of active watchdog device in initrd.
|
||||
kexec-tools always add "-a watchdog" to the dracut_args if there exists at
|
||||
least one active watchdog and user has not added specifically "-o watchdog"
|
||||
in dracut_args of kdump.conf. If a watchdog module (such as hp_wdt) has
|
||||
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
|
||||
watchdog daemon is supported as watchdog kick application.
|
||||
|
||||
Parallel Dumping Operation
|
||||
==========================
|
||||
Kexec allows kdump using multiple cpus. So parallel feature can accelerate
|
||||
dumping substantially, especially in executing compression and filter.
|
||||
For example:
|
||||
|
||||
1."makedumpfile -c --num-threads [THREAD_NUM] /proc/vmcore dumpfile"
|
||||
2."makedumpfile -c /proc/vmcore dumpfile",
|
||||
|
||||
1 has better performance than 2, if THREAD_NUM is larger than two
|
||||
and the usable cpus number is larger than THREAD_NUM.
|
||||
|
||||
Notes on how to use multiple cpus on a capture kernel on x86 system:
|
||||
|
||||
Make sure that you are using a kernel that supports disable_cpu_apicid
|
||||
kernel option as a capture kernel, which is needed to avoid x86 specific
|
||||
hardware issue (*). The disable_cpu_apicid kernel option is automatically
|
||||
appended by kdumpctl script and is ignored if the kernel doesn't support it.
|
||||
|
||||
You need to specify how many cpus to be used in a capture kernel by specifying
|
||||
the number of cpus in nr_cpus kernel option in /etc/sysconfig/kdump. nr_cpus
|
||||
is 1 at default.
|
||||
|
||||
You should use necessary and sufficient number of cpus on a capture kernel.
|
||||
Warning: Don't use too many cpus on a capture kernel, or the capture kernel
|
||||
may lead to panic due to Out Of Memory.
|
||||
|
||||
(*) Without disable_cpu_apicid kernel option, capture kernel may lead to
|
||||
hang, system reset or power-off at boot, depending on your system and runtime
|
||||
situation at the time of crash.
|
||||
|
||||
Debugging Tips
|
||||
--------------
|
||||
- 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
|
||||
scripts to drop into a shell.
|
||||
|
||||
#!/bin/bash
|
||||
_ctty=/dev/ttyS0
|
||||
setsid /bin/sh -i -l 0<>$_ctty 1<>$_ctty 2<>$_ctty
|
||||
|
||||
One might have to change the terminal depending on what they are using.
|
||||
|
||||
- Serial console logging for virtual machines
|
||||
|
||||
I generally use "virsh console <domain-name>" to get to serial console.
|
||||
I noticed after dump saving system reboots and when grub menu shows up
|
||||
some of the previously logged messages are no more there. That means
|
||||
any important debugging info at the end will be lost.
|
||||
|
||||
One can log serial console as follows to make sure messages are not lost.
|
||||
|
||||
virsh ttyconsole <domain-name>
|
||||
ln -s <name-of-tty> /dev/modem
|
||||
minicom -C /tmp/console-logs
|
||||
|
||||
Now minicom should be logging serial console in file console-logs.
|
||||
|
||||
|
521
tools/kexec-tools/files/mkdumprd
Normal file
521
tools/kexec-tools/files/mkdumprd
Normal file
@ -0,0 +1,521 @@
|
||||
#!/bin/bash --norc
|
||||
# New mkdumprd
|
||||
#
|
||||
# Copyright 2011 Red Hat, Inc.
|
||||
#
|
||||
# Written by Cong Wang <amwang@redhat.com>
|
||||
#
|
||||
|
||||
. /lib/kdump/kdump-lib.sh
|
||||
export IN_KDUMP=1
|
||||
|
||||
conf_file="/etc/kdump.conf"
|
||||
SSH_KEY_LOCATION="/root/.ssh/kdump_id_rsa"
|
||||
SAVE_PATH=$(grep ^path $conf_file| cut -d' ' -f2)
|
||||
[ -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=("--hostonly" "--hostonly-cmdline" "--hostonly-i18n" "--hostonly-mode" "strict" "-o" "plymouth dash resume ifcfg" $WDTCFG)
|
||||
OVERRIDE_RESETTABLE=0
|
||||
|
||||
add_dracut_arg() {
|
||||
local arg qarg is_quoted=0
|
||||
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() {
|
||||
add_dracut_arg "--add" "$1"
|
||||
}
|
||||
|
||||
add_dracut_mount() {
|
||||
add_dracut_arg "--mount" "$1"
|
||||
}
|
||||
|
||||
add_dracut_sshkey() {
|
||||
add_dracut_arg "--sshkey" "$1"
|
||||
}
|
||||
|
||||
# Generic substring function. If $2 is in $1, return 0.
|
||||
strstr() { [[ $1 =~ $2 ]]; }
|
||||
|
||||
# caller should ensure $1 is valid and mounted in 1st kernel
|
||||
to_mount() {
|
||||
local _dev=$1 _source _target _fstype _options _mntopts _pdev
|
||||
|
||||
_source=$(findmnt -k -f -n -r -o SOURCE $_dev)
|
||||
_target=$(get_mntpoint_from_target $_dev)
|
||||
# mount under /sysroot if dump to root disk or mount under
|
||||
#/kdumproot/$_target in other cases in 2nd kernel. systemd
|
||||
#will be in charge to umount it.
|
||||
|
||||
if [ "$_target" = "/" ];then
|
||||
_target="/sysroot"
|
||||
else
|
||||
_target="/kdumproot/$_target"
|
||||
fi
|
||||
|
||||
_fstype=$(findmnt -k -f -n -r -o FSTYPE $_dev)
|
||||
[[ -e /etc/fstab ]] && _options=$(findmnt --fstab -f -n -r -o OPTIONS $_dev)
|
||||
[ -z "$_options" ] && _options=$(findmnt -k -f -n -r -o OPTIONS $_dev)
|
||||
# with 'noauto' in fstab nfs and non-root disk mount will fail in 2nd
|
||||
# kernel, filter it out here.
|
||||
_options=$(echo $_options | sed 's/\bnoauto\b//')
|
||||
#mount fs target as rw in 2nd kernel
|
||||
_options=$(echo $_options | sed 's/\bro\b/rw/')
|
||||
|
||||
_mntopts="$_target $_fstype $_options"
|
||||
#for non-nfs _dev converting to use udev persistent name
|
||||
if [ -b "$_source" ]; then
|
||||
_pdev="$(kdump_get_persistent_dev $_source $_fstype)"
|
||||
if [ $? -ne 0 ]; 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
|
||||
#$1=dump target
|
||||
#called from while loop and shouldn't read from stdin, so we're using "ssh -n"
|
||||
get_ssh_size() {
|
||||
local _opt _out _size
|
||||
_opt="-i $SSH_KEY_LOCATION -o BatchMode=yes -o StrictHostKeyChecking=yes"
|
||||
_out=$(ssh -q -n $_opt $1 "df -P $SAVE_PATH")
|
||||
[ $? -ne 0 ] && {
|
||||
perror_exit "checking remote ssh server available size failed."
|
||||
}
|
||||
|
||||
#ssh output removed the line break, so print field NF-2
|
||||
_size=$(echo -n $_out| awk '{avail=NF-2; print $avail}')
|
||||
echo -n $_size
|
||||
}
|
||||
|
||||
#mkdir if save path does not exist on ssh dump target
|
||||
#$1=ssh dump target
|
||||
#caller should ensure write permission on $DUMP_TARGET:$SAVE_PATH
|
||||
#called from while loop and shouldn't read from stdin, so we're using "ssh -n"
|
||||
mkdir_save_path_ssh()
|
||||
{
|
||||
local _opt _dir
|
||||
_opt="-i $SSH_KEY_LOCATION -o BatchMode=yes -o StrictHostKeyChecking=yes"
|
||||
ssh -qn $_opt $1 mkdir -p $SAVE_PATH 2>&1 > /dev/null
|
||||
_ret=$?
|
||||
if [ $_ret -ne 0 ]; then
|
||||
perror_exit "mkdir failed on $DUMP_TARGET:$SAVE_PATH"
|
||||
fi
|
||||
|
||||
#check whether user has write permission on $SAVE_PATH/$DUMP_TARGET
|
||||
_dir=$(ssh -qn $_opt $1 mktemp -dqp $SAVE_PATH 2>/dev/null)
|
||||
_ret=$?
|
||||
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"
|
||||
fi
|
||||
ssh -qn $_opt $1 rmdir $_dir
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
#Function: get_fs_size
|
||||
#$1=dump target
|
||||
get_fs_size() {
|
||||
local _mnt=$(get_mntpoint_from_target $1)
|
||||
echo -n $(df -P "${_mnt}/$SAVE_PATH"|tail -1|awk '{print $4}')
|
||||
}
|
||||
|
||||
#Function: get_raw_size
|
||||
#$1=dump target
|
||||
get_raw_size() {
|
||||
echo -n $(fdisk -s "$1")
|
||||
}
|
||||
|
||||
#Function: check_size
|
||||
#$1: dump type string ('raw', 'fs', 'ssh')
|
||||
#$2: dump target
|
||||
check_size() {
|
||||
local avail memtotal
|
||||
|
||||
memtotal=$(awk '/MemTotal/{print $2}' /proc/meminfo)
|
||||
case "$1" in
|
||||
raw)
|
||||
avail=$(get_raw_size "$2")
|
||||
;;
|
||||
ssh)
|
||||
avail=$(get_ssh_size "$2")
|
||||
;;
|
||||
fs)
|
||||
avail=$(get_fs_size "$2")
|
||||
;;
|
||||
*)
|
||||
return
|
||||
esac
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
perror_exit "Check dump target size failed"
|
||||
fi
|
||||
|
||||
if [ $avail -lt $memtotal ]; then
|
||||
echo "Warning: There might not be enough space to save a vmcore."
|
||||
echo " The size of $2 should be greater than $memtotal kilo bytes."
|
||||
fi
|
||||
}
|
||||
|
||||
# $1: core_collector config value
|
||||
verify_core_collector() {
|
||||
if grep -q "^raw" $conf_file && [ "${1%% *}" != "makedumpfile" ]; then
|
||||
echo "Warning: specifying a non-makedumpfile core collector, you will have to recover the vmcore manually."
|
||||
fi
|
||||
if is_ssh_dump_target || is_raw_dump_target; then
|
||||
if [ "${1%% *}" = "makedumpfile" ]; then
|
||||
! strstr "$1" "-F" && {
|
||||
perror_exit "The specified dump target needs makedumpfile \"-F\" option."
|
||||
}
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
add_mount() {
|
||||
local _mnt=$(to_mount "$1")
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
add_dracut_mount "$_mnt"
|
||||
}
|
||||
|
||||
# get_maj_min <device>
|
||||
# Prints the major and minor of a device node.
|
||||
# Example:
|
||||
# $ get_maj_min /dev/sda2
|
||||
# 8:2
|
||||
get_maj_min() {
|
||||
local _dev
|
||||
_dev=$(stat -L -c '$((0x%t)):$((0x%T))' "$1" 2>/dev/null)
|
||||
_dev=$(eval "echo $_dev")
|
||||
echo $_dev
|
||||
}
|
||||
|
||||
# ugly workaround for the lvm design
|
||||
# There is no volume group device,
|
||||
# so, there are no slave devices for volume groups.
|
||||
# Logical volumes only have the slave devices they really live on,
|
||||
# but you cannot create the logical volume without the volume group.
|
||||
# And the volume group might be bigger than the devices the LV needs.
|
||||
check_vol_slaves() {
|
||||
local _lv _vg _pv
|
||||
for i in /dev/mapper/*; do
|
||||
_lv=$(get_maj_min $i)
|
||||
if [[ $_lv = $2 ]]; then
|
||||
_vg=$(lvm lvs --noheadings -o vg_name $i 2>/dev/null)
|
||||
# strip space
|
||||
_vg=$(echo $_vg)
|
||||
if [[ $_vg ]]; then
|
||||
for _pv in $(lvm vgs --noheadings -o pv_name "$_vg" 2>/dev/null)
|
||||
do
|
||||
check_block_and_slaves $1 $(get_maj_min $_pv) && return 0
|
||||
done
|
||||
fi
|
||||
fi
|
||||
done
|
||||
return 1
|
||||
}
|
||||
|
||||
# Walk all the slave relationships for a given block device.
|
||||
# Stop when our helper function returns success
|
||||
# $1 = function to call on every found block device
|
||||
# $2 = block device in major:minor format
|
||||
check_block_and_slaves() {
|
||||
local _x
|
||||
[[ -b /dev/block/$2 ]] || return 1 # Not a block device? So sorry.
|
||||
"$1" $2 && return
|
||||
check_vol_slaves "$@" && return 0
|
||||
if [[ -f /sys/dev/block/$2/../dev ]]; then
|
||||
check_block_and_slaves $1 $(cat "/sys/dev/block/$2/../dev") && return 0
|
||||
fi
|
||||
[[ -d /sys/dev/block/$2/slaves ]] || return 1
|
||||
for _x in /sys/dev/block/$2/slaves/*/dev; do
|
||||
[[ -f $_x ]] || continue
|
||||
check_block_and_slaves $1 $(cat "$_x") && return 0
|
||||
done
|
||||
return 1
|
||||
}
|
||||
|
||||
#handle the case user does not specify the dump target explicitly
|
||||
handle_default_dump_target()
|
||||
{
|
||||
local _target
|
||||
local _mntpoint
|
||||
|
||||
is_user_configured_dump_target && return
|
||||
|
||||
check_save_path_fs $SAVE_PATH
|
||||
|
||||
_mntpoint=$(get_mntpoint_from_path $SAVE_PATH)
|
||||
_target=$(get_target_from_path $SAVE_PATH)
|
||||
|
||||
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
|
||||
|
||||
SAVE_PATH=${SAVE_PATH##"$_mntpoint"}
|
||||
add_mount "$_target"
|
||||
check_size fs $_target
|
||||
}
|
||||
|
||||
get_override_resettable()
|
||||
{
|
||||
local override_resettable
|
||||
|
||||
override_resettable=$(grep "^override_resettable" $conf_file)
|
||||
if [ -n "$override_resettable" ]; then
|
||||
OVERRIDE_RESETTABLE=$(echo $override_resettable | cut -d' ' -f2)
|
||||
if [ "$OVERRIDE_RESETTABLE" != "0" ] && [ "$OVERRIDE_RESETTABLE" != "1" ];then
|
||||
perror_exit "override_resettable value $OVERRIDE_RESETTABLE is invalid"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
# $1: function name
|
||||
for_each_block_target()
|
||||
{
|
||||
local dev majmin
|
||||
|
||||
for dev in $(get_kdump_targets); do
|
||||
[ -b "$dev" ] || continue
|
||||
majmin=$(get_maj_min $dev)
|
||||
check_block_and_slaves $1 $majmin && return 1
|
||||
done
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
|
||||
|
||||
#judge if a specific device with $1 is unresettable
|
||||
#return false if unresettable.
|
||||
is_unresettable()
|
||||
{
|
||||
local path="/sys/$(udevadm info --query=all --path=/sys/dev/block/$1 | awk '/^P:/ {print $2}' | sed -e 's/\(cciss[0-9]\+\/\).*/\1/g' -e 's/\/block\/.*$//')/resettable"
|
||||
local resettable=1
|
||||
|
||||
if [ -f "$path" ]
|
||||
then
|
||||
resettable="$(cat $path)"
|
||||
[ $resettable -eq 0 -a "$OVERRIDE_RESETTABLE" -eq 0 ] && {
|
||||
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"
|
||||
return 0
|
||||
}
|
||||
fi
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
#check if machine is resettable.
|
||||
#return true if resettable
|
||||
check_resettable()
|
||||
{
|
||||
local _ret _target
|
||||
|
||||
get_override_resettable
|
||||
|
||||
for_each_block_target is_unresettable
|
||||
_ret=$?
|
||||
|
||||
[ $_ret -eq 0 ] && return
|
||||
|
||||
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()
|
||||
{
|
||||
local _ret _target
|
||||
|
||||
for_each_block_target is_crypt
|
||||
_ret=$?
|
||||
|
||||
[ $_ret -eq 0 ] && return
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
if ! check_resettable; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! check_crypt; then
|
||||
echo "Warning: Encrypted device is in dump path. User will prompted for password during second kernel boot."
|
||||
fi
|
||||
|
||||
# firstly get right SSH_KEY_LOCATION
|
||||
keyfile=$(awk '/^sshkey/ {print $2}' $conf_file)
|
||||
if [ -f "$keyfile" ]; then
|
||||
# canonicalize the path
|
||||
SSH_KEY_LOCATION=$(/usr/bin/readlink -m $keyfile)
|
||||
fi
|
||||
|
||||
if [ "$(uname -m)" = "s390x" ]; then
|
||||
add_dracut_module "znet"
|
||||
fi
|
||||
|
||||
while read config_opt config_val;
|
||||
do
|
||||
# remove inline comments after the end of a directive.
|
||||
config_val=$(strip_comments $config_val)
|
||||
case "$config_opt" in
|
||||
extra_modules)
|
||||
extra_modules="$extra_modules $config_val"
|
||||
;;
|
||||
ext[234]|xfs|btrfs|minix|nfs)
|
||||
if ! findmnt $config_val >/dev/null; then
|
||||
perror_exit "Dump target $config_val is probably not mounted."
|
||||
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)
|
||||
#checking raw disk writable
|
||||
dd if=$config_val count=1 of=/dev/null > /dev/null 2>&1 || {
|
||||
perror_exit "Bad raw disk $config_val"
|
||||
}
|
||||
_praw=$(kdump_get_persistent_dev $config_val "raw")
|
||||
if [ $? -ne 0 ]; then
|
||||
exit 1
|
||||
fi
|
||||
add_dracut_arg "--device" "$_praw"
|
||||
check_size raw $config_val
|
||||
;;
|
||||
ssh)
|
||||
if strstr "$config_val" "@";
|
||||
then
|
||||
check_size ssh $config_val
|
||||
mkdir_save_path_ssh $config_val
|
||||
add_dracut_module "ssh-client"
|
||||
add_dracut_sshkey "$SSH_KEY_LOCATION"
|
||||
else
|
||||
perror_exit "Bad ssh dump target $config_val"
|
||||
fi
|
||||
;;
|
||||
core_collector)
|
||||
verify_core_collector "$config_val"
|
||||
;;
|
||||
dracut_args)
|
||||
add_dracut_arg $config_val
|
||||
;;
|
||||
*)
|
||||
if [ -n $(echo $config_opt | grep "^#.*$") ]
|
||||
then
|
||||
continue
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
done < $conf_file
|
||||
|
||||
handle_default_dump_target
|
||||
|
||||
if [ -n "$extra_modules" ]
|
||||
then
|
||||
add_dracut_arg "--add-drivers" "$extra_modules"
|
||||
fi
|
||||
|
||||
if ! is_fadump_capable; then
|
||||
# The 2nd rootfs mount stays behind the normal dump target mount,
|
||||
# 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))"
|
||||
|
||||
add_dracut_arg "--no-hostonly-default-device"
|
||||
fi
|
||||
|
||||
dracut "${dracut_args[@]}" "$@"
|
||||
_rc=$?
|
||||
sync
|
||||
exit $_rc
|
33
tools/kexec-tools/files/mkdumprd.8
Normal file
33
tools/kexec-tools/files/mkdumprd.8
Normal file
@ -0,0 +1,33 @@
|
||||
.TH MKDUMRD 8 "Fri Feb 9 2007"
|
||||
.SH NAME
|
||||
mkdumprd \- creates initial ramdisk images for kdump crash recovery
|
||||
.SH SYNOPSIS
|
||||
\fBmkdumprd\fR [OPTION]
|
||||
|
||||
.SH DESCRIPTION
|
||||
\fBmkdumprd\fR creates an initial ram file system for use in conjunction with
|
||||
the booting of a kernel within the kdump framework for crash recovery.
|
||||
\fBmkdumprds\fR purpose is to create an initial ram filesystem capable of copying
|
||||
the crashed systems vmcore image to a location specified in \fI/etc/kdump.conf
|
||||
|
||||
\fBmkdumprd\fR interrogates the running system to understand what modules need to
|
||||
be loaded in the initramfs (based on configuration retrieved from
|
||||
\fI/etc/kdump.conf)\fR
|
||||
|
||||
\fBmkdumprd\fR add a new \fBdracut\fR module 99kdumpbase and use \fBdracut\fR
|
||||
utility to generate the initramfs.
|
||||
|
||||
\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
|
||||
you require a custom kdump initramfs image, it is suggested that you use the
|
||||
kdump service infrastructure to create one, and then manually unpack, modify and
|
||||
repack the image.
|
||||
|
||||
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
All options here are passed to dracut directly, please refer \fBdracut\fR docs
|
||||
for the info.
|
||||
|
||||
.SH "SEE ALSO"
|
||||
.BR dracut (8)
|
128
tools/kexec-tools/files/supported-kdump-targets.txt
Normal file
128
tools/kexec-tools/files/supported-kdump-targets.txt
Normal file
@ -0,0 +1,128 @@
|
||||
Supported Kdump Targets
|
||||
|
||||
This document try to list all supported kdump targets, and those supported
|
||||
or unknown/tech-preview targets, this can help users to decide whether a dump
|
||||
solution is available.
|
||||
|
||||
Dump Target support status
|
||||
==========================
|
||||
This section tries to come up with some kind of guidelines in terms of
|
||||
what dump targets are supported/not supported. Whatever is listed here
|
||||
is not binding in any manner. It is just sharing of current understanding
|
||||
and if something is not right, this section needs to be edited.
|
||||
|
||||
Following are 3 lists. First one contains supported targets. These are
|
||||
generic configurations which should work and some configuration most
|
||||
likely has worked in testing. Second list is known unsupported targets.
|
||||
These targets we know either don't work or we don't support. And third
|
||||
list is unknown/tech-preview. We either don't yet know the status of kdump
|
||||
on these targets or these are under tech-preview.
|
||||
|
||||
Note, these lists are not set in stone and can be changed at any point of
|
||||
time. Also these lists might not be complete. We will add/remove items to
|
||||
it as we get more testing information. Also, there are many corner cases
|
||||
which can't possibly be listed. For example in general we might be
|
||||
supporting software iscsi but there might be some configurations of it
|
||||
which don't work.
|
||||
|
||||
So if any target is listed in supported section, it does not mean it works
|
||||
in all possible configurations. It just means that in common configurations
|
||||
it should work but there can be issues with particular configurations which
|
||||
are not supported. As we come to know of particular issues, we will keep on
|
||||
updating lists accordingly.
|
||||
|
||||
|
||||
Supported Dump targets
|
||||
----------------------
|
||||
storage:
|
||||
LVM volume (no thinp)
|
||||
FC disks (qla2xxx, lpfc, bnx2fc, bfa)
|
||||
software initiator based iSCSI
|
||||
software RAID (mdraid)
|
||||
hardware RAID (cciss, hpsa, megaraid_sas, mpt2sas, aacraid)
|
||||
SCSI/SATA disks
|
||||
iSCSI HBA (all offload)
|
||||
hardware FCoE (qla2xxx, lpfc, bfa)
|
||||
software FCoE (bnx2fc, fcoe/ixgbe) (Extra configuration required,
|
||||
please read "Note on FCoE" section below)
|
||||
|
||||
network:
|
||||
Hardware using kernel modules: (tg3, igb, ixgbe, sfc, e1000e, bna,
|
||||
cnic, netxen_nic, qlge, bnx2x, bnx, qlcnic, be2net, enic,
|
||||
virtio-net, ixgbevf, igbvf)
|
||||
protocol: ipv4
|
||||
bonding
|
||||
vlan
|
||||
bridge
|
||||
team
|
||||
vlan tagged bonding
|
||||
bridge over bond/team/vlan
|
||||
|
||||
hypervisor:
|
||||
kvm
|
||||
xen (Supported in select configurations only)
|
||||
|
||||
filesystem:
|
||||
ext[234]
|
||||
xfs
|
||||
nfs
|
||||
|
||||
firmware:
|
||||
BIOS
|
||||
UEFI
|
||||
|
||||
hypervisor:
|
||||
VMWare ESXi 4.1 and 5.1
|
||||
Hyper-V 2012 R2 (RHEL Gen1 UP Guest only)
|
||||
|
||||
Unsupported Dump targets
|
||||
------------------------
|
||||
storage:
|
||||
BIOS RAID
|
||||
Thin provisioning volume
|
||||
Software iSCSI with iBFT (bnx2i, cxgb3i, cxgb4i)
|
||||
Software iSCSI with hybrid (be2iscsi)
|
||||
FCoE
|
||||
legacy IDE
|
||||
glusterfs
|
||||
gfs2/clvm/halvm
|
||||
|
||||
network:
|
||||
hardware using kernel modules: (sfc SRIOV, cxgb4vf, pch_gbe)
|
||||
protocol: ipv6
|
||||
wireless
|
||||
Infiniband (IB)
|
||||
vlan over bridge/team
|
||||
|
||||
filesystem:
|
||||
btrfs
|
||||
|
||||
Unknown/tech-preview
|
||||
--------------------
|
||||
storage:
|
||||
PCI Express based SSDs
|
||||
|
||||
hypervisor:
|
||||
Hyper-V 2008
|
||||
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
|
||||
============
|
||||
[1] RHEL6: Enabling kdump for full-virt (HVM) Xen DomU
|
||||
(https://access.redhat.com/knowledge/solutions/92943)
|
1
tox.ini
1
tox.ini
@ -27,6 +27,7 @@ whitelist_externals = bash
|
||||
commands =
|
||||
bash -c "find {toxinidir} \
|
||||
-path {toxinidir}/kubernetes/plugins/isolcpus-device-plugin/files/vendor -prune -o \
|
||||
-path {toxinidir}/tools/kexec-tools/files -prune -o \
|
||||
-not \( -type d -name .?\* -prune \) \
|
||||
-type f \
|
||||
-not -name \*~ \
|
||||
|
Loading…
Reference in New Issue
Block a user