Merge "Update kexec-tools/makedumpfile to support v5.10 kernel"
This commit is contained in:
commit
edef047a87
@ -218,3 +218,6 @@ python-boto3
|
|||||||
|
|
||||||
# Pf bbdev configuration tool for ACC100 (Mt. Bryce)
|
# Pf bbdev configuration tool for ACC100 (Mt. Bryce)
|
||||||
pf-bb-config
|
pf-bb-config
|
||||||
|
|
||||||
|
# kexec-tools
|
||||||
|
kexec-tools
|
||||||
|
@ -94,3 +94,4 @@ python/python-daemon
|
|||||||
base/inih
|
base/inih
|
||||||
base/pf-bb-config
|
base/pf-bb-config
|
||||||
gpu/gpu-operator
|
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##
|
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##
|
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##
|
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##
|
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##
|
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##
|
# 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-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##
|
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##
|
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##
|
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-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##
|
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##
|
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##
|
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##
|
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
|
!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##
|
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##
|
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 =
|
commands =
|
||||||
bash -c "find {toxinidir} \
|
bash -c "find {toxinidir} \
|
||||||
-path {toxinidir}/kubernetes/plugins/isolcpus-device-plugin/files/vendor -prune -o \
|
-path {toxinidir}/kubernetes/plugins/isolcpus-device-plugin/files/vendor -prune -o \
|
||||||
|
-path {toxinidir}/tools/kexec-tools/files -prune -o \
|
||||||
-not \( -type d -name .?\* -prune \) \
|
-not \( -type d -name .?\* -prune \) \
|
||||||
-type f \
|
-type f \
|
||||||
-not -name \*~ \
|
-not -name \*~ \
|
||||||
|
Loading…
Reference in New Issue
Block a user