Hi, Xunlei
On 05/23/16 at 03:06pm, Xunlei Pang wrote:
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 clients deployed with kdump
diskless boot, 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.
As an example:
dracut_args --mount "192.168.1.1:/test test nfs defaults"
NOTE:
-Only one mount information is allowed using "dracut_args".
-Dracut will create <mountpoint> if it doesn't exist in kdump kernel.
-Users should do a test first and ensure it works because kdump does
not prepare the mount and check all the validity.
Suggested-by: Dave Young <dyoung(a)redhat.com>
Signed-off-by: Xunlei Pang <xlpang(a)redhat.com>
---
dracut-kdump.sh | 6 +++++-
dracut-module-setup.sh | 6 ++++++
kdump-lib.sh | 31 ++++++++++++++++++++++++++++++-
kdumpctl | 13 ++++++++++++-
mkdumprd | 5 +++++
5 files changed, 58 insertions(+), 3 deletions(-)
diff --git a/dracut-kdump.sh b/dracut-kdump.sh
index 4aab205..c5bd4a6 100755
--- a/dracut-kdump.sh
+++ b/dracut-kdump.sh
@@ -117,7 +117,7 @@ save_vmcore_dmesg_ssh() {
get_host_ip()
{
local _host
- if is_nfs_dump_target || is_ssh_dump_target
+ if is_nfs_dump_target || is_ssh_dump_target || dracut_args_contains_nfsmount
then
kdumpnic=$(getarg kdumpnic=)
[ -z "$kdumpnic" ] && echo "kdump: failed to get
kdumpnic!" && return 1
@@ -146,6 +146,10 @@ read_kdump_conf()
# remove inline comments after the end of a directive.
config_val=$(strip_comments $config_val)
case "$config_opt" in
+ dracut_args)
+ config_val=$(get_target_from_dracut_args_val "$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"
;;
diff --git a/dracut-module-setup.sh b/dracut-module-setup.sh
index 4cd7107..a95e87b 100755
--- a/dracut-module-setup.sh
+++ b/dracut-module-setup.sh
@@ -433,6 +433,11 @@ kdump_install_conf() {
ssh|nfs)
kdump_install_net "$config_val"
;;
+ dracut_args)
+ if [[ $(get_fstype_from_dracut_args_val "$config_val") = nfs* ]];
then
+ kdump_install_net "$(get_target_from_dracut_args_val
"$config_val")"
+ fi
+ ;;
kdump_pre|kdump_post|extra_bins)
dracut_install $config_val
;;
@@ -684,6 +689,7 @@ install() {
inst "/bin/date" "/bin/date"
inst "/bin/sync" "/bin/sync"
inst "/bin/cut" "/bin/cut"
+ inst "/usr/bin/awk" "/usr/bin/awk"
Can we avoid installing extra tools like awk, if it is for getting the fs type from
fstab line, we can do similar thing as dracut modules.d/95fstab-sys/mount-sys.sh:
read _dev _mp _fs _opts < $1
Or using cut:
echo $1|tr -s [:blank:]|cut -d' ' -f3
Suppose $a is the line with --mount in /etc/kdump.conf
_fstab=$(echo ${a#*--mount})
inst "/bin/head" "/bin/head"
inst "/sbin/makedumpfile" "/sbin/makedumpfile"
inst "/sbin/vmcore-dmesg" "/sbin/vmcore-dmesg"
diff --git a/kdump-lib.sh b/kdump-lib.sh
index fc2c036..39a2d00 100755
--- a/kdump-lib.sh
+++ b/kdump-lib.sh
@@ -45,7 +45,8 @@ is_fs_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 $(dracut_args_contains_mount || is_ssh_dump_target || is_nfs_dump_target ||
\
+ is_raw_dump_target || is_fs_dump_target)
}
strip_comments()
@@ -279,3 +280,31 @@ is_hostname()
fi
echo $1 | grep -q "[a-zA-Z]"
}
+
+# If "dracut_args" contains "--mount" information, use it
+# directly without any check(users are expected to ensure
+# its correctness).
+dracut_args_contains_mount()
+{
+ return $(grep ^dracut_args /etc/kdump.conf | grep -q "\-\-mount")
+}
+
+dracut_args_contains_nfsmount()
+{
+ local config_val
+
+ config_val=$(grep ^dracut_args /etc/kdump.conf | awk -F "--mount \""
'{print $2}' | cut -d' ' -f3)
+ [[ $config_val = nfs* ]] && return 0
+
+ return 1
+}
+
+get_fstype_from_dracut_args_val()
+{
+ echo $1 | awk -F "--mount \"" '{print $2}' | cut -d'
' -f3
+}
+
+get_target_from_dracut_args_val()
+{
+ echo $1 | awk -F "--mount \"" '{print $2}' | cut -d'
' -f1
+}
diff --git a/kdumpctl b/kdumpctl
index fcc9ad0..aa8232c 100755
--- a/kdumpctl
+++ b/kdumpctl
@@ -236,12 +236,18 @@ check_config()
{
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 ] && {
echo "More than one dump targets specified."
return 1
}
+ nr=$(grep "^dracut_args .*\-\-mount" $KDUMP_CONFIG_FILE | grep -o
"\-\-mount" | wc -l)
+ [ $nr -gt 1 ] && {
+ echo "More than one mount targets specified in \"dracut_args\"."
+ return 1
+ }
+
while read config_opt config_val; do
# remove inline comments after the end of a directive.
config_val=$(strip_comments $config_val)
@@ -365,6 +371,11 @@ check_dump_fs_modified()
local _new_dev _new_mntpoint _new_fstype
local _target _path _dracut_args
+ # No need to check in case of mount target specified via "dracut_args".
+ if dracut_args_contains_mount; then
+ return 0
+ fi
+
# No need to check in case of raw target.
# 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
diff --git a/mkdumprd b/mkdumprd
index 78afb1a..573da96 100644
--- a/mkdumprd
+++ b/mkdumprd
@@ -544,6 +544,11 @@ do
verify_core_collector "$config_val"
;;
dracut_args)
+ if [[ $(get_fstype_from_dracut_args_val "$config_val") = nfs* ]]; then
is_nfs_in_dracut_args sounds better?
like get_fstype_from_dracut_args_vgl seems too long, how about something like:
get_dracut_args_fs;
get_dracut_args_target;
...
+ add_dracut_module "nfs"
+ # nfs may not be mounted, we need to add nfs related modules explicitly.
+ add_dracut_arg "--add-drivers" "nfs nfsv4"
+ fi
add_dracut_arg $config_val
;;
*)
--
1.8.3.1
Thanks
Dave