in subject s/raleted/related/
Thanks
Philipp
On Thu, 19 Aug 2021 19:39:32 +0800
Kairui Song <kasong(a)redhat.com> wrote:
These dump related functions are only used by dracut-kdump.sh.
Signed-off-by: Kairui Song <kasong(a)redhat.com>
---
dracut-kdump.sh | 288 ++++++++++++++++++++++++++++++++++++++++
kdump-lib-initramfs.sh | 289 -----------------------------------------
2 files changed, 288 insertions(+), 289 deletions(-)
diff --git a/dracut-kdump.sh b/dracut-kdump.sh
index 352cad56..a785ab92 100755
--- a/dracut-kdump.sh
+++ b/dracut-kdump.sh
@@ -4,13 +4,301 @@
#
. /lib/dracut-lib.sh
+. /lib/kdump-logger.sh
. /lib/kdump-lib-initramfs.sh
+#initiate the kdump logger
+dlog_init
+if [ $? -ne 0 ]; then
+ echo "failed to initiate the kdump logger."
+ exit 1
+fi
+
+KDUMP_PATH="/var/crash"
+KDUMP_LOG_FILE="/run/initramfs/kexec-dmesg.log"
+CORE_COLLECTOR=""
+DEFAULT_CORE_COLLECTOR="makedumpfile -l --message-level 7 -d 31"
+DMESG_COLLECTOR="/sbin/vmcore-dmesg"
+FAILURE_ACTION="systemctl reboot -f"
+DATEDIR=`date +%Y-%m-%d-%T`
+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_PRE=""
+KDUMP_POST=""
+NEWROOT="/sysroot"
+OPALCORE="/sys/firmware/opal/mpipl/core"
+
set -o pipefail
DUMP_RETVAL=0
export PATH=$PATH:$KDUMP_SCRIPT_DIR
+get_kdump_confs()
+{
+ local config_opt config_val
+
+ while read config_opt config_val;
+ do
+ # remove inline comments after the end of a directive.
+ 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"
+ ;;
+ failure_action|default)
+ case $config_val in
+ shell)
+ FAILURE_ACTION="kdump_emergency_shell"
+ ;;
+ reboot)
+ FAILURE_ACTION="systemctl reboot -f && exit"
+ ;;
+ halt)
+ FAILURE_ACTION="halt && exit"
+ ;;
+ poweroff)
+ FAILURE_ACTION="systemctl poweroff -f &&
exit"
+ ;;
+ dump_to_rootfs)
+ FAILURE_ACTION="dump_to_rootfs"
+ ;;
+ esac
+ ;;
+ final_action)
+ case $config_val in
+ reboot)
+ FINAL_ACTION="systemctl reboot -f"
+ ;;
+ halt)
+ FINAL_ACTION="halt"
+ ;;
+ poweroff)
+ FINAL_ACTION="systemctl poweroff -f"
+ ;;
+ esac
+ ;;
+ esac
+ done <<< "$(kdump_read_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
+}
+
+# store the kexec kernel log to a file.
+save_log()
+{
+ dmesg -T > $KDUMP_LOG_FILE
+
+ if command -v journalctl > /dev/null; then
+ journalctl -ab >> $KDUMP_LOG_FILE
+ fi
+ chmod 600 $KDUMP_LOG_FILE
+}
+
+# dump_fs <mount point>
+dump_fs()
+{
+ local _exitcode
+ local _mp=$1
+ local _op=$(get_mount_info OPTIONS target $_mp -f)
+ ddebug "dump_fs _mp=$_mp _opts=$_op"
+
+ if ! is_mounted "$_mp"; then
+ dinfo "dump path \"$_mp\" is not mounted, trying to
mount..."
+ mount --target $_mp
+ if [ $? -ne 0 ]; then
+ derror "failed to dump to \"$_mp\", it's not a mount
point!"
+ return 1
+ fi
+ 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"`
+
+ local _dump_path=$(echo "$_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/" | tr -s /)
+
+ dinfo "saving to $_dump_path"
+
+ # Only remount to read-write mode if the dump target is mounted read-only.
+ if [[ "$_op" = "ro"* ]]; then
+ dinfo "Remounting the dump target in rw mode."
+ mount -o remount,rw $_mp || return 1
+ fi
+
+ mkdir -p $_dump_path || return 1
+
+ save_vmcore_dmesg_fs ${DMESG_COLLECTOR} "$_dump_path"
+ save_opalcore_fs "$_dump_path"
+
+ dinfo "saving vmcore"
+ $CORE_COLLECTOR /proc/vmcore $_dump_path/vmcore-incomplete
+ _exitcode=$?
+ if [ $_exitcode -eq 0 ]; then
+ mv $_dump_path/vmcore-incomplete $_dump_path/vmcore
+ sync
+ dinfo "saving vmcore complete"
+ else
+ derror "saving vmcore failed, _exitcode:$_exitcode"
+ fi
+
+ dinfo "saving the $KDUMP_LOG_FILE to $_dump_path/"
+ save_log
+ mv $KDUMP_LOG_FILE $_dump_path/
+ if [ $_exitcode -ne 0 ]; then
+ return 1
+ fi
+
+ # improper kernel cmdline can cause the failure of echo, we can ignore this kind of
failure
+ return 0
+}
+
+save_vmcore_dmesg_fs() {
+ local _dmesg_collector=$1
+ local _path=$2
+
+ dinfo "saving vmcore-dmesg.txt to ${_path}"
+ $_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
+ chmod 600 ${_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
+ dinfo "saving vmcore-dmesg.txt complete"
+ else
+ if [ -f ${_path}/vmcore-dmesg-incomplete.txt ]; then
+ chmod 600 ${_path}/vmcore-dmesg-incomplete.txt
+ fi
+ derror "saving vmcore-dmesg.txt failed"
+ fi
+}
+
+save_opalcore_fs() {
+ local _path=$1
+
+ if [ ! -f $OPALCORE ]; then
+ # Check if we are on an old kernel that uses a different path
+ if [ -f /sys/firmware/opal/core ]; then
+ OPALCORE="/sys/firmware/opal/core"
+ else
+ return 0
+ fi
+ fi
+
+ dinfo "saving opalcore:$OPALCORE to ${_path}/opalcore"
+ cp $OPALCORE ${_path}/opalcore
+ if [ $? -ne 0 ]; then
+ derror "saving opalcore failed"
+ return 1
+ fi
+
+ sync
+ dinfo "saving opalcore complete"
+ return 0
+}
+
+dump_to_rootfs()
+{
+
+ if [[ $(systemctl status dracut-initqueue | sed -n "s/^\s*Active:
\(\S*\)\s.*$/\1/p") == "inactive" ]]; then
+ dinfo "Trying to bring up initqueue for rootfs mount"
+ systemctl start dracut-initqueue
+ fi
+
+ dinfo "Clean up dead systemd services"
+ systemctl cancel
+ dinfo "Waiting for rootfs mount, will timeout after 90 seconds"
+ systemctl start --no-block sysroot.mount
+
+ _loop=0
+ while [ $_loop -lt 90 ] && ! is_mounted /sysroot; do
+ sleep 1
+ _loop=$((_loop + 1))
+ done
+
+ if ! is_mounted /sysroot; then
+ derror "Failed to mount rootfs"
+ return
+ fi
+
+ ddebug "NEWROOT=$NEWROOT"
+ dump_fs $NEWROOT
+}
+
+kdump_emergency_shell()
+{
+ ddebug "Switching to kdump emergency shell..."
+
+ [ -f /etc/profile ] && . /etc/profile
+ export PS1='kdump:${PWD}# '
+
+ . /lib/dracut-lib.sh
+ if [ -f /dracut-state.sh ]; then
+ . /dracut-state.sh 2>/dev/null
+ fi
+
+ source_conf /etc/conf.d
+
+ type plymouth >/dev/null 2>&1 && plymouth quit
+
+ source_hook "emergency"
+ while read _tty rest; do
+ (
+ echo
+ echo
+ echo 'Entering kdump emergency mode.'
+ echo 'Type "journalctl" to view system logs.'
+ echo 'Type "rdsosreport" to generate a sosreport, you can
then'
+ echo 'save it elsewhere and attach it to a bug report.'
+ echo
+ echo
+ ) > /dev/$_tty
+ done < /proc/consoles
+ sh -i -l
+ /bin/rm -f -- /.console_lock
+}
+
+do_failure_action()
+{
+ dinfo "Executing failure action $FAILURE_ACTION"
+ eval $FAILURE_ACTION
+}
+
+do_final_action()
+{
+ dinfo "Executing final action $FINAL_ACTION"
+ eval $FINAL_ACTION
+}
do_dump()
{
local _ret
diff --git a/kdump-lib-initramfs.sh b/kdump-lib-initramfs.sh
index e7f623c4..051135ae 100755
--- a/kdump-lib-initramfs.sh
+++ b/kdump-lib-initramfs.sh
@@ -3,35 +3,9 @@
# Function and variables used in initramfs environment, POSIX compatible
#
-. /lib/kdump-logger.sh
-
DEFAULT_PATH="/var/crash/"
-KDUMP_PATH="/var/crash"
-KDUMP_LOG_FILE="/run/initramfs/kexec-dmesg.log"
-CORE_COLLECTOR=""
-DEFAULT_CORE_COLLECTOR="makedumpfile -l --message-level 7 -d 31"
-DMESG_COLLECTOR="/sbin/vmcore-dmesg"
-FAILURE_ACTION="systemctl reboot -f"
-DATEDIR=`date +%Y-%m-%d-%T`
-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_PRE=""
-KDUMP_POST=""
-NEWROOT="/sysroot"
-OPALCORE="/sys/firmware/opal/mpipl/core"
KDUMP_CONFIG_FILE="/etc/kdump.conf"
-#initiate the kdump logger
-dlog_init
-if [ $? -ne 0 ]; then
- echo "failed to initiate the kdump logger."
- exit 1
-fi
-
# Read kdump config in well formated style
kdump_read_conf()
{
@@ -156,266 +130,3 @@ is_fs_dump_target()
{
[[ $(kdump_get_conf_val "ext[234]\|xfs\|btrfs\|minix") ]]
}
-
-get_kdump_confs()
-{
- local config_opt config_val
-
- while read config_opt config_val;
- do
- # remove inline comments after the end of a directive.
- 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"
- ;;
- failure_action|default)
- case $config_val in
- shell)
- FAILURE_ACTION="kdump_emergency_shell"
- ;;
- reboot)
- FAILURE_ACTION="systemctl reboot -f && exit"
- ;;
- halt)
- FAILURE_ACTION="halt && exit"
- ;;
- poweroff)
- FAILURE_ACTION="systemctl poweroff -f &&
exit"
- ;;
- dump_to_rootfs)
- FAILURE_ACTION="dump_to_rootfs"
- ;;
- esac
- ;;
- final_action)
- case $config_val in
- reboot)
- FINAL_ACTION="systemctl reboot -f"
- ;;
- halt)
- FINAL_ACTION="halt"
- ;;
- poweroff)
- FINAL_ACTION="systemctl poweroff -f"
- ;;
- esac
- ;;
- esac
- done <<< "$(kdump_read_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
-}
-
-# store the kexec kernel log to a file.
-save_log()
-{
- dmesg -T > $KDUMP_LOG_FILE
-
- if command -v journalctl > /dev/null; then
- journalctl -ab >> $KDUMP_LOG_FILE
- fi
- chmod 600 $KDUMP_LOG_FILE
-}
-
-# dump_fs <mount point>
-dump_fs()
-{
- local _exitcode
- local _mp=$1
- local _op=$(get_mount_info OPTIONS target $_mp -f)
- ddebug "dump_fs _mp=$_mp _opts=$_op"
-
- if ! is_mounted "$_mp"; then
- dinfo "dump path \"$_mp\" is not mounted, trying to
mount..."
- mount --target $_mp
- if [ $? -ne 0 ]; then
- derror "failed to dump to \"$_mp\", it's not a mount
point!"
- return 1
- fi
- 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"`
-
- local _dump_path=$(echo "$_mp/$KDUMP_PATH/$HOST_IP-$DATEDIR/" | tr -s /)
-
- dinfo "saving to $_dump_path"
-
- # Only remount to read-write mode if the dump target is mounted read-only.
- if [[ "$_op" = "ro"* ]]; then
- dinfo "Remounting the dump target in rw mode."
- mount -o remount,rw $_mp || return 1
- fi
-
- mkdir -p $_dump_path || return 1
-
- save_vmcore_dmesg_fs ${DMESG_COLLECTOR} "$_dump_path"
- save_opalcore_fs "$_dump_path"
-
- dinfo "saving vmcore"
- $CORE_COLLECTOR /proc/vmcore $_dump_path/vmcore-incomplete
- _exitcode=$?
- if [ $_exitcode -eq 0 ]; then
- mv $_dump_path/vmcore-incomplete $_dump_path/vmcore
- sync
- dinfo "saving vmcore complete"
- else
- derror "saving vmcore failed, _exitcode:$_exitcode"
- fi
-
- dinfo "saving the $KDUMP_LOG_FILE to $_dump_path/"
- save_log
- mv $KDUMP_LOG_FILE $_dump_path/
- if [ $_exitcode -ne 0 ]; then
- return 1
- fi
-
- # improper kernel cmdline can cause the failure of echo, we can ignore this kind of
failure
- return 0
-}
-
-save_vmcore_dmesg_fs() {
- local _dmesg_collector=$1
- local _path=$2
-
- dinfo "saving vmcore-dmesg.txt to ${_path}"
- $_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
- chmod 600 ${_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
- dinfo "saving vmcore-dmesg.txt complete"
- else
- if [ -f ${_path}/vmcore-dmesg-incomplete.txt ]; then
- chmod 600 ${_path}/vmcore-dmesg-incomplete.txt
- fi
- derror "saving vmcore-dmesg.txt failed"
- fi
-}
-
-save_opalcore_fs() {
- local _path=$1
-
- if [ ! -f $OPALCORE ]; then
- # Check if we are on an old kernel that uses a different path
- if [ -f /sys/firmware/opal/core ]; then
- OPALCORE="/sys/firmware/opal/core"
- else
- return 0
- fi
- fi
-
- dinfo "saving opalcore:$OPALCORE to ${_path}/opalcore"
- cp $OPALCORE ${_path}/opalcore
- if [ $? -ne 0 ]; then
- derror "saving opalcore failed"
- return 1
- fi
-
- sync
- dinfo "saving opalcore complete"
- return 0
-}
-
-dump_to_rootfs()
-{
-
- if [[ $(systemctl status dracut-initqueue | sed -n "s/^\s*Active:
\(\S*\)\s.*$/\1/p") == "inactive" ]]; then
- dinfo "Trying to bring up initqueue for rootfs mount"
- systemctl start dracut-initqueue
- fi
-
- dinfo "Clean up dead systemd services"
- systemctl cancel
- dinfo "Waiting for rootfs mount, will timeout after 90 seconds"
- systemctl start --no-block sysroot.mount
-
- _loop=0
- while [ $_loop -lt 90 ] && ! is_mounted /sysroot; do
- sleep 1
- _loop=$((_loop + 1))
- done
-
- if ! is_mounted /sysroot; then
- derror "Failed to mount rootfs"
- return
- fi
-
- ddebug "NEWROOT=$NEWROOT"
- dump_fs $NEWROOT
-}
-
-kdump_emergency_shell()
-{
- ddebug "Switching to kdump emergency shell..."
-
- [ -f /etc/profile ] && . /etc/profile
- export PS1='kdump:${PWD}# '
-
- . /lib/dracut-lib.sh
- if [ -f /dracut-state.sh ]; then
- . /dracut-state.sh 2>/dev/null
- fi
-
- source_conf /etc/conf.d
-
- type plymouth >/dev/null 2>&1 && plymouth quit
-
- source_hook "emergency"
- while read _tty rest; do
- (
- echo
- echo
- echo 'Entering kdump emergency mode.'
- echo 'Type "journalctl" to view system logs.'
- echo 'Type "rdsosreport" to generate a sosreport, you can
then'
- echo 'save it elsewhere and attach it to a bug report.'
- echo
- echo
- ) > /dev/$_tty
- done < /proc/consoles
- sh -i -l
- /bin/rm -f -- /.console_lock
-}
-
-do_failure_action()
-{
- dinfo "Executing failure action $FAILURE_ACTION"
- eval $FAILURE_ACTION
-}
-
-do_final_action()
-{
- dinfo "Executing final action $FINAL_ACTION"
- eval $FINAL_ACTION
-}