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@redhat.com Signed-off-by: Xunlei Pang xlpang@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 ;; *)
Since the approach is doable, NAK on these RFC patches, I will post the formal patch soon.
On 2016年05月20日 at 21:09, 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 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@redhat.com Signed-off-by: Xunlei Pang xlpang@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 ;;