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 specifed 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,x-initrd.mount"
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 | 4 ++++
dracut-module-setup.sh | 1 +
kdump-lib.sh | 22 +++++++++++++++++++++-
kdump.conf | 17 +++++++++++++++++
kdump.conf.5 | 16 ++++++++++++++++
kdumpctl | 13 ++++++++++++-
kexec-kdump-howto.txt | 21 +++++++++++++++++++++
mkdumprd | 3 +++
8 files changed, 95 insertions(+), 2 deletions(-)
diff --git a/dracut-kdump.sh b/dracut-kdump.sh
index 4aab205..dae9871 100755
--- a/dracut-kdump.sh
+++ b/dracut-kdump.sh
@@ -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..5caadc7 100755
--- a/dracut-module-setup.sh
+++ b/dracut-module-setup.sh
@@ -684,6 +684,7 @@ install() {
inst "/bin/date" "/bin/date"
inst "/bin/sync" "/bin/sync"
inst "/bin/cut" "/bin/cut"
+ inst "/usr/bin/awk" "/usr/bin/awk"
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..4b61106 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,22 @@ 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). It overrides any target specified in
+# /etc/kdump.conf.
+dracut_args_contains_mount()
+{
+ return $(grep ^dracut_args /etc/kdump.conf | grep -q "\-\-mount")
+}
+
+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/kdump.conf b/kdump.conf
index 54b581d..ed20f71 100644
--- a/kdump.conf
+++ b/kdump.conf
@@ -133,6 +133,23 @@
# - Pass extra dracut options when rebuilding kdump
# initrd.
#
+# Users can utilize this directive to pass "--mount" to kdump,
+# please refer to "man dracut" for the format of "--mount"
argument.
+# If there is any "--mount" specified via "dracut_args", kdump
+# always uses it as the final mount target without any validation
+# (mounting or checking like mount options, fs size, save path, etc),
+# so users are expected to ensure all its correctness. It conflicts
+# with targets specified via "ext[234]/xfs/btrfs/nfs".
+#
+# As an nfs example:
+# dracut_args --mount "192.168.1.1:/test test nfs defaults,x-initrd.mount"
+#
+# NOTE:
+# -Only one mount target is allowed using "dracut_args" globally.
+# -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.
+#
# fence_kdump_args <arg(s)>
# - Command line arguments for fence_kdump_send (it can contain
# all valid arguments except hosts to send notification to).
diff --git a/kdump.conf.5 b/kdump.conf.5
index f1c2a2c..b01a993 100644
--- a/kdump.conf.5
+++ b/kdump.conf.5
@@ -183,6 +183,22 @@ to try dumping. By default, it's set to 0, means not to try a
destined failure.
.RS
Kdump uses dracut to generate initramfs for second kernel. This option
allows a user to pass arguments to dracut directly.
+
+Users can utilize this directive to pass "--mount" to kdump, please refer
+to "man dracut" for the format of "--mount" argument. If there is
any
+"--mount" specified via "dracut_args", kdump always uses it as the
final
+mount target without any validation(mounting or checking like mount options,
+fs size, save path, etc), so users are expected to ensure all the correctness.
+It conflicts with targets specified via "ext[234]/xfs/btrfs/nfs".
+
+As an nfs example:
+dracut_args --mount "192.168.1.1:/test test nfs defaults,x-initrd.mount"
+
+NOTE:
+-Only one mount target is allowed using "dracut_args" globally.
+-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.
.RE
diff --git a/kdumpctl b/kdumpctl
index fcc9ad0..ce807b3 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/kexec-kdump-howto.txt b/kexec-kdump-howto.txt
index b4cdc22..dde95c6 100644
--- a/kexec-kdump-howto.txt
+++ b/kexec-kdump-howto.txt
@@ -345,6 +345,27 @@ mount the NFS mount and copy out the vmcore to your NFS server.
Restart the
kdump service via '/sbin/systemctl restart kdump.service' to commit this change
to your kdump initrd.
+Special mount via "dracut_args"
+
+Kdump uses dracut to generate initramfs for second kernel. This option
+allows a user to pass arguments to dracut directly.
+
+Users can utilize "dracut_args" to pass "--mount" to kdump, please
refer
+to "man dracut" for the format of "--mount" argument. If there is
any
+"--mount" specified via "dracut_args", kdump always uses it as the
final
+mount target without any validation(mounting or checking like mount options,
+fs size, save path, etc), so users are expected to ensure all the correctness.
+It conflicts with targets specified via "ext[234]/xfs/btrfs/nfs".
+
+As an nfs special mount example:
+dracut_args --mount "192.168.1.1:/test test nfs defaults,x-initrd.mount"
+
+NOTE:
+-Only one mount target is allowed using "dracut_args" globally.
+-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.
+
Remote system via ssh/scp
Dumping over ssh/scp requires setting up passwordless ssh keys for every
diff --git a/mkdumprd b/mkdumprd
index 78afb1a..f4623ef 100644
--- a/mkdumprd
+++ b/mkdumprd
@@ -544,6 +544,9 @@ do
verify_core_collector "$config_val"
;;
dracut_args)
+ if [[ $(get_fstype_from_dracut_args_val "$config_val") = nfs* ]]; then
+ add_dracut_module "nfs"
+ fi
add_dracut_arg $config_val
;;
*)
--
1.8.3.1