When user does not specify dump target explicitly, it's better to
dump to the "path" specified. That means after dump user enter into
1st kernel, can find vmcore in the "path". If that path is in root
fs, vmcore is stored in root fs. If separate disk is mounted on
any tier of "path", we just dump vmcore into the left path on the
left separate disk.
E.g in kdump.conf
path /mnt/nfs
in mount info,
/dev/vdb on /mnt type ext4 (rw,relatime,seclabel,data=ordered)
Then vmcore will be saved in /nfs of /dev/vdb.
In this patch, pass mount info to dracut in this case if separate
disk is mounted on any tier of "path".
Meanwhile introduce a function in kdump-lib.sh to check if any
target is specified.
Signed-off-by: Baoquan He <bhe(a)redhat.com>
---
kdump-lib.sh | 14 ++++++++++++++
mkdumprd | 36 +++++++++++++++++++++---------------
2 files changed, 35 insertions(+), 15 deletions(-)
diff --git a/kdump-lib.sh b/kdump-lib.sh
index 384f7b4..de32650 100755
--- a/kdump-lib.sh
+++ b/kdump-lib.sh
@@ -52,6 +52,20 @@ get_user_configured_dump_disk()
return
}
+is_user_configured_dump_target()
+{
+ local _target
+
+ if is_ssh_dump_target || is_nfs_dump_target; then
+ return 0
+ fi
+
+ _target=$(egrep "^ext[234]|^xfs|^btrfs|^minix|^raw" /etc/kdump.conf
2>/dev/null |awk '{print $2}')
+ [ -n "$_target" ] && return 0
+
+ return 1
+}
+
get_root_fs_device()
{
local _target
diff --git a/mkdumprd b/mkdumprd
index 93fc7fe..31002e8 100644
--- a/mkdumprd
+++ b/mkdumprd
@@ -334,25 +334,31 @@ get_block_dump_target()
[ -b "$_target" ] && echo $(to_dev_name $_target)
}
-# If no dump disk is specified make sure /var/crash is not mounted on a
-# separate disk.
-check_block_dump_target()
+#handle the case user does not specify the dump target explicitly
+handle_default_dump_target()
{
local _target
local _mntpoint
+ local _fstype
- _target=$(get_user_configured_dump_disk)
- [ -n "$_target" ] && return
+ is_user_configured_dump_target && return
- _target=$(get_root_fs_device)
- if [ -b "$_target" ]; then
- mkdir -p $SAVE_PATH
- _mntpoint=`df $SAVE_PATH | tail -1 | awk '{print $NF}'`
- if [ "$_mntpoint" != "/" ]; then
- perror "No dump target specified. Default dump target is rootfs block
device."
- perror "But dump path $SAVE_PATH is not backed by rootfs block device.
"
- perror_exit "Either explicitly specify a dump target or specify a dump
path backed by rootfs block device"
+ if [ ! -d $SAVE_PATH ]; then
+ perror_exit "Please check if path:$SAVE_PATH has been created."
+ fi
+
+ _mntpoint=$(df $SAVE_PATH | tail -1 | awk '{print $NF}')
+ _target=$(df $SAVE_PATH | tail -1 | awk '{print $1}')
+ if [ "$_mntpoint" != "/" ]; then
+ SAVE_PATH=${SAVE_PATH##"$_mntpoint"}
+ _fstype=$(findmnt -k -f -n -r -o FSTYPE $_mntpoint)
+
+ if [ "$_fstype" = "nfs" ]; then
+ add_dracut_module "nfs"
fi
+
+ add_mount "$_target"
+ check_size fs $_target
fi
}
@@ -479,8 +485,6 @@ check_crypt()
return 1
}
-check_block_dump_target
-
if ! check_resettable; then
exit 1
fi
@@ -558,6 +562,8 @@ do
esac
done < $conf_file
+handle_default_dump_target
+
if [ -n "$extra_modules" ]
then
add_dracut_arg "--add-drivers" "$extra_modules"
--
1.8.5.3