f8d7090b59
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. v4->v5: Per Vivek's comment, add a helper function is_fs_dump_target. Then is_user_configured_dump_target is rewrite with these helper functions. v5->v7: No v6 for this patch. Just use newly introduced function is_fs_type_nfs in handle_default_dump_target. Signed-off-by: Baoquan He <bhe@redhat.com> Acked-by: Vivek Goyal <vgoyal@redhat.com>
141 lines
2.8 KiB
Bash
Executable File
141 lines
2.8 KiB
Bash
Executable File
#!/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"
|
|
|
|
is_ssh_dump_target()
|
|
{
|
|
grep -q "^ssh[[:blank:]].*@" /etc/kdump.conf
|
|
}
|
|
|
|
is_nfs_dump_target()
|
|
{
|
|
grep -q "^nfs" /etc/kdump.conf
|
|
}
|
|
|
|
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
|
|
}
|
|
|
|
is_user_configured_dump_target()
|
|
{
|
|
return $(is_ssh_dump_target || is_nfs_dump_target || is_raw_dump_target || is_fs_dump_target)
|
|
}
|
|
|
|
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 -q '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
|
|
}
|
|
|
|
get_user_configured_dump_disk()
|
|
{
|
|
local _target
|
|
|
|
if is_ssh_dump_target || is_nfs_dump_target; then
|
|
return
|
|
fi
|
|
|
|
_target=$(egrep "^ext[234]|^xfs|^btrfs|^minix|^raw" /etc/kdump.conf 2>/dev/null |awk '{print $2}')
|
|
[ -n "$_target" ] && echo $_target
|
|
|
|
return
|
|
}
|
|
|
|
get_root_fs_device()
|
|
{
|
|
local _target
|
|
_target=$(findmnt -k -f -n -o SOURCE /)
|
|
[ -n "$_target" ] && echo $_target
|
|
|
|
return
|
|
}
|
|
|
|
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)
|
|
}
|
|
|
|
get_mntpoint_from_target()
|
|
{
|
|
echo $(findmnt -k -f -n -r -o TARGET $1)
|
|
}
|
|
|
|
# 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)
|
|
echo "${_mnt}/$SAVE_PATH"
|
|
}
|
|
|
|
check_save_path_fs()
|
|
{
|
|
local _path=$1
|
|
|
|
if [ ! -d $_path ]; then
|
|
perror_exit "Dump path $_path does not exist."
|
|
fi
|
|
}
|
|
|