Support special mount information via "dracut_args"

There are some complaints about nfs kdump that users must mount
nfs beforehand, which may cause some overhead to nfs server.
For example, there're thounsands of diskless clients deployed with
nfs dumping, each time the client is boot up, it will trigger
kdump rebuilding so will mount nfs, thus resulting in thousands
of nfs request concurrently imposed on the same nfs server.

We introduce a new way of specifying mount information via the
already-existent "dracut_args" directive(so avoid adding extra
directives in /etc/kdump.conf), we will skip all the filesystem
mounting and checking stuff for it. So it can be used in the
above-mentioned nfs scenario to avoid severe nfs server overhead.

Specifically, if there is any "--mount" information specified via
"dracut_args" in /etc/kdump.conf, always use it as the final mount
without any validation(mounting or checking like mount options,
fs size, etc), so users are expected to ensure its correctness.

NOTE:
-Only one mount target is allowed using "dracut_args" globally.
-Dracut will create <mountpoint> if it doesn't exist in kdump kernel,
 <mountpoint> must be specified as an absolute path.
-Users should do a test first and ensure it works because kdump does
 not prepare the mount or check all the validity.

Reviewed-by: Pratyush Anand <panand@redhat.com>
Suggested-by: Dave Young <dyoung@redhat.com>
Acked-by: Dave Young <dyoung@redhat.com>
Signed-off-by: Xunlei Pang <xlpang@redhat.com>
This commit is contained in:
Xunlei Pang 2016-08-26 11:23:35 +08:00 committed by Dave Young
parent 8e669fa5dd
commit 74c6f46429
4 changed files with 45 additions and 3 deletions

View File

@ -146,6 +146,10 @@ read_kdump_conf()
# remove inline comments after the end of a directive. # remove inline comments after the end of a directive.
config_val=$(strip_comments $config_val) config_val=$(strip_comments $config_val)
case "$config_opt" in 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) ext[234]|xfs|btrfs|minix|nfs)
add_dump_code "dump_fs $config_val" add_dump_code "dump_fs $config_val"
;; ;;

View File

@ -450,6 +450,11 @@ kdump_install_conf() {
ssh|nfs) ssh|nfs)
kdump_install_net "$config_val" 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) kdump_pre|kdump_post|extra_bins)
dracut_install $config_val dracut_install $config_val
;; ;;

View File

@ -23,7 +23,8 @@ is_ssh_dump_target()
is_nfs_dump_target() is_nfs_dump_target()
{ {
grep -q "^nfs" /etc/kdump.conf grep -q "^nfs" /etc/kdump.conf || \
[[ $(get_dracut_args_fstype "$(grep "^dracut_args .*\-\-mount" /etc/kdump.conf)") = nfs* ]]
} }
is_raw_dump_target() is_raw_dump_target()
@ -45,7 +46,8 @@ is_fs_dump_target()
is_user_configured_dump_target() is_user_configured_dump_target()
{ {
return $(is_ssh_dump_target || is_nfs_dump_target || is_raw_dump_target || is_fs_dump_target) return $(is_mount_in_dracut_args || is_ssh_dump_target || is_nfs_dump_target || \
is_raw_dump_target || is_fs_dump_target)
} }
strip_comments() strip_comments()
@ -406,3 +408,23 @@ is_wdt_mod_omitted() {
return $ret 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
}

View File

@ -236,12 +236,18 @@ check_config()
{ {
local nr local nr
nr=$(awk 'BEGIN{cnt=0} /^raw|^ssh[[:blank:]]|^nfs|^ext[234]|^xfs|^btrfs|^minix/{cnt++} END{print cnt}' $KDUMP_CONFIG_FILE) nr=$(awk 'BEGIN{cnt=0} /^raw|^ssh[[:blank:]]|^nfs|^ext[234]|^xfs|^btrfs|^minix|^dracut_args .*\-\-mount/{cnt++} END{print cnt}' $KDUMP_CONFIG_FILE)
[ $nr -gt 1 ] && { [ $nr -gt 1 ] && {
echo "More than one dump targets specified." echo "More than one dump targets specified."
return 1 return 1
} }
nr=$(grep "^dracut_args .*\-\-mount" $KDUMP_CONFIG_FILE | grep -o "\-\-mount" | wc -l)
[ $nr -gt 1 ] && {
echo "Multiple mount targets specified in one \"dracut_args\"."
return 1
}
while read config_opt config_val; do while read config_opt config_val; do
# remove inline comments after the end of a directive. # remove inline comments after the end of a directive.
config_val=$(strip_comments $config_val) config_val=$(strip_comments $config_val)
@ -365,6 +371,11 @@ check_dump_fs_modified()
local _new_dev _new_mntpoint _new_fstype local _new_dev _new_mntpoint _new_fstype
local _target _path _dracut_args local _target _path _dracut_args
# No need to check in case of mount target specified via "dracut_args".
if is_mount_in_dracut_args; then
return 0
fi
# No need to check in case of raw target. # No need to check in case of raw target.
# Currently we do not check also if ssh/nfs target is specified # Currently we do not check also if ssh/nfs target is specified
if is_ssh_dump_target || is_nfs_dump_target || is_raw_dump_target; then if is_ssh_dump_target || is_nfs_dump_target || is_raw_dump_target; then