On 24/05/2016:04:36:36 PM, Xunlei Pang wrote:
On 2016/05/24 at 16:16, Pratyush Anand wrote:
> Hi Xunlei,
>
> On 23/05/2016:03:06:00 PM, 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
> What about for the name is_dracut_args_contain_nfsmount? It will match other
> nomenclature.
> Similarly for is_dracut_args_contain_mount.
"contain" is a verb, using "is_" prefix is probably not improper, is
"does_" prefer better?
OK.. I am fine with "does_".
>
>> 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"
>> 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
>> }
Yes, you are right..here itself more than one target including dracut_args will be
detected.
>>
>> + 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
>> + }
>> +
> Probably we should also return error if kdump.conf has dracut_args and then
> other target like 'nfs hostip:/nfsdir'. Otherwise
> kdump_install_conf()->kdump_install_net() might perform the wrong settings.
The check above should guarantee what you concerned.
Regards,
Xunlei
>
>> 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
>> + 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
>> ;;
>> *)
~Pratyush