[PATCH v2 1/2] kdump.conf: Support passing special mount information via "dracut_args"
by Xunlei Pang
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.
When doing nfs mount via "dracut_args", because nfs needn't to be
mounted beforehand, some nfs-related ko modules must be explicitly
specified as needed together in the "dracut_args"(or via directive
"extra_modules" in /etc/kdump.conf). As an nfs example:
dracut_args --mount "192.168.1.1:/test /test nfs defaults" --add-driver "nfs nfsv4"
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 in an absolute path.
-There must be double quotation marks behind "--mount", i.e. --mount "<mount info>".
-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 | 5 +++++
kdump-lib.sh | 41 ++++++++++++++++++++++++++++++++++++++++-
kdumpctl | 13 ++++++++++++-
mkdumprd | 3 +++
5 files changed, 65 insertions(+), 3 deletions(-)
diff --git a/dracut-kdump.sh b/dracut-kdump.sh
index 4aab205..8747dba 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 || does_dracut_args_contain_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_dracut_args_target "$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..5f03558 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 is_nfs_in_dracut_args "$config_val"; then
+ kdump_install_net "$(get_dracut_args_target "$config_val")"
+ fi
+ ;;
kdump_pre|kdump_post|extra_bins)
dracut_install $config_val
;;
diff --git a/kdump-lib.sh b/kdump-lib.sh
index fc2c036..a486db6 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 $(does_dracut_args_contain_mount || is_ssh_dump_target || is_nfs_dump_target || \
+ is_raw_dump_target || is_fs_dump_target)
}
strip_comments()
@@ -279,3 +280,41 @@ 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).
+does_dracut_args_contain_mount()
+{
+ return $(grep ^dracut_args /etc/kdump.conf | grep -q "\-\-mount")
+}
+
+does_dracut_args_contain_nfsmount()
+{
+ local fstype
+
+ fstype=$(grep "^dracut_args .*\-\-mount" /etc/kdump.conf | sed "s/.*--mount \"\(.*\)/\1/" | cut -d' ' -f3)
+ [[ $fstype = nfs* ]] && return 0
+
+ return 1
+}
+
+# $1: configuration value of "dracut_args".
+is_nfs_in_dracut_args()
+{
+ [[ $(get_dracut_args_fstype "$1") = nfs* ]] && return 0
+
+ return 1
+}
+
+# $1: configuration value of "dracut_args".
+get_dracut_args_fstype()
+{
+ echo $1 | grep "\-\-mount" | sed "s/.*--mount \"\(.*\)/\1/" | cut -d' ' -f3
+}
+
+# $1: configuration value of "dracut_args".
+get_dracut_args_target()
+{
+ echo $1 | grep "\-\-mount" | sed "s/.*--mount \"\(.*\)/\1/" | cut -d' ' -f1
+}
diff --git a/kdumpctl b/kdumpctl
index fcc9ad0..fbed66d 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 does_dracut_args_contain_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..7a0e733 100644
--- a/mkdumprd
+++ b/mkdumprd
@@ -544,6 +544,9 @@ do
verify_core_collector "$config_val"
;;
dracut_args)
+ if is_nfs_in_dracut_args "$config_val"; then
+ add_dracut_module "nfs"
+ fi
add_dracut_arg $config_val
;;
*)
--
1.8.3.1
6 years, 11 months
[PATCH] documentation fix
by Freeman Zhang
There are lots of typos and incorrect expressions in kdump.conf,
as well as its manpage kdump.conf.5. Fix them to make it less
confusing.
Signed-off-by: Freeman Zhang <zhezhang(a)redhat.com>
Reported-by: Donald Berry <dberry(a)redhat.com>
---
kdump.conf | 73 +++++++++++++++++++++++++++++-----------------------------
kdump.conf.5 | 75 ++++++++++++++++++++++++++----------------------------------
2 files changed, 70 insertions(+), 78 deletions(-)
diff --git a/kdump.conf b/kdump.conf
index 54b581d..09716d7 100644
--- a/kdump.conf
+++ b/kdump.conf
@@ -1,16 +1,16 @@
-# Configures where to put the kdump /proc/vmcore files
+# Configure where&how to save the kdump /proc/vmcore files
#
# This file contains a series of commands to perform (in order) when a
# kernel crash has happened and the kdump kernel has been loaded. Directives in
-# this file are only applicable to the kdump initramfs, and have no effect if
+# this file are only applicable to the kdump initramfs, and show no effect if
# the root filesystem is mounted and the normal init scripts are processed
#
-# Currently only one dump target and path may be configured at once
-# if the configured dump target fails, the default action will be preformed
-# the default action may be configured with the default directive below. If the
-# configured dump target succedes
+# Currently, only one dump target and path can be specified at a time.
+# If the configured dump target fails, the default action will be performed.
+# The default action may be configured with the default directive.
+#
+# Basic commands supported are:
#
-# Basics commands supported are:
# raw <partition> - Will dd /proc/vmcore into <partition>.
# Use persistent device names for partition devices,
# such as /dev/vg/<devname>.
@@ -23,9 +23,9 @@
# NOTE: make sure user has necessary write
# permissions on server
#
-# sshkey <path> - Will use the sshkey to do ssh dump
-# Specifies the path of the ssh key you want to use
-# when do ssh dump, the default value is
+# sshkey <path> - Will use the sshkey to do ssh dump.
+# Specify the path of the ssh key you want to use
+# when dumping via ssh, the default value is
# /root/.ssh/kdump_id_rsa.
#
# <fs type> <partition> - Will mount -t <fs type> <partition> /mnt and copy
@@ -58,9 +58,9 @@
# options are not needed here, as the initrd will
# automatically be populated with a config file
# appropriate for the running kernel.
-# Default core_collector for raw/ssh dump is:
+# The default core_collector for raw/ssh dump is:
# "makedumpfile -F -l --message-level 1 -d 31".
-# Default core_collector for other targets is:
+# The default core_collector for other targets is:
# "makedumpfile -l --message-level 1 -d 31".
# For core_collector format details please refer to
# kexec-kdump-howto.txt or kdump.conf manpage.
@@ -70,14 +70,14 @@
# executable just after the memory dump process
# terminates. The exit status from the dump process
# is fed to the kdump_post executable, which can be
-# used to trigger different actions for success or
-# failure.
+# used to trigger actions for success or failure
+# respectively.
#
# kdump_pre <binary | script>
-# - works just like the kdump_post directive, but instead
-# of running after the dump process, runs immediately
-# before. Exit status of this binary is interpreted
-# as follows:
+# - Works just like the kdump_post directive, but instead
+# of running after the dump process, the executable runs
+# right before the dumping. Exit status of the execution
+# is interpreted as follows:
# 0 - continue with dump process as usual
# non 0 - reboot the system
#
@@ -90,28 +90,27 @@
#
# extra_modules <module(s)>
# - This directive allows you to specify extra kernel
-# modules that you want to be loaded in the kdump
+# modules that you wish to be loaded in the kdump
# initrd, typically used to set up access to
# non-boot-path dump targets that might otherwise
# not be accessible in the kdump environment. Multiple
-# modules can be listed, separated by a space, and any
+# modules can be listed, separated by spaces, and any
# dependent modules will automatically be included.
#
# default <reboot | halt | poweroff | shell | dump_to_rootfs>
-# - Action to preform in case dumping to intended target
+# - Action to perform in case dumping to intended target
# fails. If no default action is specified, "reboot"
# is assumed default.
# reboot: If the default action is reboot simply reboot
-# the system and loose the core that you are
+# the system and drop the core that you are
# trying to retrieve.
# halt: If the default action is halt, then simply
-# halt the system after attempting to capture
-# a vmcore, regardless of success or failure.
+# halt the system after failure.
# poweroff: The system will be powered down
# shell: If the default action is shell, then drop to
-# an shell session inside the initramfs from
-# where you can try to record the core manually.
-# Exiting this shell reboots the system.
+# a shell session inside the initramfs from
+# where you can try to save the core manually.
+# Then exit this shell to reboot the system.
# Note: kdump uses bash as the default shell.
# dump_to_rootfs: If non-root dump target is specified,
# the default action can be set as dump_to_rootfs.
@@ -119,15 +118,16 @@
# to rootfs from initramfs context and reboot.
#
# force_rebuild <0 | 1>
-# - By default, kdump initrd only will be rebuilt when
+# - By default, kdump initrd will only be rebuilt when
# necessary. Specify 1 to force rebuilding kdump
# initrd every time when kdump service starts.
#
-#override_resettable <0 | 1>
-# - Usually a unresettable block device can't be dump target.
-# Specifying 1 means though block target is unresettable, user
-# understand this situation and want to try dumping. By default,
-# it's set to 0, means not to try a destined failure.
+# override_resettable <0 | 1>
+# - Usually an unresettable block device can't be a dump
+# target. Specifying 1 means that even though the block
+# target is unresettable, the user wants to try dumping
+# anyway. By default, it's set to 0, which will not try
+# something destined to failure.
#
# dracut_args <arg(s)>
# - Pass extra dracut options when rebuilding kdump
@@ -135,11 +135,12 @@
#
# fence_kdump_args <arg(s)>
# - Command line arguments for fence_kdump_send (it can contain
-# all valid arguments except hosts to send notification to).
+# all valid arguments except hosts to send notification to).
#
# fence_kdump_nodes <node(s)>
-# - List of cluster node(s) separated by space to send fence_kdump
-# notification to (this option is mandatory to enable fence_kdump).
+# - List of cluster node(s), separated by spaces, to send
+# fence_kdump notifications to (this option is mandatory to
+# enable fence_kdump).
#
#raw /dev/vg/lv_kdump
diff --git a/kdump.conf.5 b/kdump.conf.5
index f1c2a2c..5eabad7 100644
--- a/kdump.conf.5
+++ b/kdump.conf.5
@@ -11,13 +11,13 @@ collection service.
kdump.conf provides post-kexec instructions to the kdump kernel. It is
stored in the initrd file managed by the kdump service. If you change
this file and do not want to restart before it takes effect, restart
-the kdump service to rebuild to initrd.
+the kdump service to rebuild the initrd.
For most configurations, you can simply review the examples provided
in the stock /etc/kdump.conf.
.B NOTE:
-For filesystem dump the dump target must be mounted before building
+For filesystem dumps the dump target must be mounted before building
kdump initramfs.
kdump.conf only affects the behavior of the initramfs. Please read the
@@ -48,8 +48,8 @@ server and that a fqdn is used as the server name
.B sshkey <path>
.RS
-Specifies the path of the ssh key you want to use when do ssh dump,
-the default value is /root/.ssh/kdump_id_rsa.
+Specifies the path of the ssh key you want to use when dumping via ssh.
+The default value is /root/.ssh/kdump_id_rsa.
.RE
.B <fs type> <partition>
@@ -77,26 +77,20 @@ Ignored for raw device dumps. If unset, will default to /var/crash.
.B core_collector <command> <options>
.RS
This allows you to specify the command to copy the vmcore.
-You could use the dump filtering program makedumpfile, the default one,
-to retrieve your core, which on some arches can drastically reduce
-core file size. See /sbin/makedumpfile --help for a list of options.
+The default is makedumpfile, which can drastically reduce core file size on
+some architectures. See /sbin/makedumpfile --help for a list of options.
Note that the -i and -g options are not needed here, as the initrd
-will automatically be populated with a config file appropriate
-for the running kernel.
+will automatically be populated with a config file appropriate for the
+running kernel.
.PP
-Note 1: About default core collector:
-Default core_collector for raw/ssh dump is:
+Note 1: The default core_collector for raw/ssh dump is:
"makedumpfile -F -l --message-level 1 -d 31".
-Default core_collector for other targets is:
+The default core_collector for other targets is:
"makedumpfile -l --message-level 1 -d 31".
-Even if core_collector option is commented out in kdump.conf, makedumpfile
-is default core collector and kdump uses it internally.
-If one does not want makedumpfile as default core_collector, then they
-need to specify one using core_collector option to change the behavior.
.PP
Note 2: If "makedumpfile -F" is used then you will get a flattened format
vmcore.flat, you will need to use "makedumpfile -R" to rearrange the
-dump data from stdard input to a normal dumpfile (readable with analysis
+dump data from standard input to a normal dumpfile (readable with analysis
tools).
ie. "makedumpfile -R vmcore < vmcore.flat"
@@ -108,26 +102,25 @@ This directive allows you to run a specified
executable just after the memory dump process
terminates. The exit status from the dump process
is fed to the kdump_post executable, which can be
-used to trigger different actions for success or
-failure.
+used to trigger actions for success or failure repectively.
.PP
Note that scripts written for use with this
-directive must use the /bin/bash interpreter
+directive must use the /bin/bash interpreter.
.RE
.B kdump_pre <binary | script>
.RS
Works just like the kdump_post directive, but instead
-of running after the dump process, runs immediately
-before. Exit status of this binary is interpreted
-as follows:
+of running after the dump process, the specified executable
+runs right before dumping. Exit status of the execution is
+interpreted as follows:
.PP
0 - continue with dump process as usual
.PP
non 0 - reboot the system
.PP
Note that scripts written for this directive must use
-the /bin/bash interpreter
+the /bin/bash interpreter.
.RE
.B extra_bins <binaries | shell scripts>
@@ -142,22 +135,22 @@ relies on other binaries or scripts.
.B extra_modules <module(s)>
.RS
This directive allows you to specify extra kernel
-modules that you want to be loaded in the kdump
+modules that you wish to be loaded in the kdump
initrd, typically used to set up access to
non-boot-path dump targets that might otherwise
not be accessible in the kdump environment. Multiple
-modules can be listed, separated by a space, and any
+modules can be listed, separated by spaces, and any
dependent modules will automatically be included.
.RE
.B default <reboot | halt | poweroff | shell | dump_to_rootfs>
.RS
-Action to preform in case dumping to intended target fails. If no default
+Action to perform in case dumping to intended target fails. If no default
action is specified, "reboot" is assumed default.
reboot: If the default action is reboot simply reboot the system (this is what
most people will want, as it returns the system to a nominal state). shell: If the default
-action is shell, then drop to an shell session inside the initramfs from
-where you can manually preform additional recovery actions. Exiting this shell
+action is shell, then drop to a shell session inside the initramfs from
+where you can manually perform additional recovery actions. Exiting this shell
reboots the system. halt: bring the system to a halt, requiring manual reset
poweroff: The system will be powered down. dump_to_rootfs:If the default action
is dump_to_rootfs, specified root will be mounted and dump will be saved in "path"
@@ -167,15 +160,15 @@ Note: kdump uses bash as the default shell.
.B force_rebuild <0 | 1>
.RS
-By default, kdump initrd only will be rebuilt when necessary.
+By default, kdump initrd will only be rebuilt when necessary.
Specify 1 to force rebuilding kdump initrd every time when kdump service starts.
.RE
.B override_resettable <0 | 1>
.RS
-Usually a unresettable block device can't be dump target. Specifying 1 means
-though block target is unresettable, user understand this situation and want
-to try dumping. By default, it's set to 0, means not to try a destined failure.
+Usually an unresettable block device can't be dump target. Specifying 1 means
+that even though block target is unresettable, user wants to try dumping anyway.
+By default, it's set to 0, which will not try something destined to failure.
.RE
@@ -195,7 +188,7 @@ arguments except hosts to send notification to).
.B fence_kdump_nodes <node(s)>
.RS
-List of cluster node(s) separated by space to send fence_kdump notification
+List of cluster node(s), separated by spaces, to send fence_kdump notification
to (this option is mandatory to enable fence_kdump).
.RE
@@ -210,25 +203,23 @@ directly.
.B options <module> <option list>
.RS
-Use KDUMP_COMMANDLINE_APPEND in /etc/sysconfig/kdump to add proper
-module option as kernel command line params. Such as append loop.max_loop=1
-to limit maximum loop devices to 1.
+Use KDUMP_COMMANDLINE_APPEND in /etc/sysconfig/kdump to add module options as kernel command line parameters. For example, specify 'append loop.max_loop=1' to limit maximum loop devices to 1.
.RE
.B link_delay <seconds>
.RS
-link_delay was used to wait a network device to initialize before using it.
+link_delay was used to wait for a network device to initialize before using it.
Now dracut network module take care of this issue automaticlly.
.RE
.B disk_timeout <seconds>
.RS
-Similar to link_delay, dracut ensures disks being ready before kdump uses them.
+Similar to link_delay, dracut ensures disks are ready before kdump uses them.
.RE
.B debug_mem_level <0-3>
.RS
-This was used to turns on debug/verbose output of kdump scripts regarding
+This was used to turn on debug/verbose output of kdump scripts regarding
free/used memory at various points of execution. This feature has been
moved to dracut now.
Use KDUMP_COMMANDLINE_APPEND in /etc/sysconfig/kdump and
@@ -253,7 +244,7 @@ present in initramfs but it is not actually loaded in kernel. Hence
retaining blacklist option creates more confusing behavior. It has been
deprecated.
.PP
-Instead use rd.driver.blacklist option on second kernel to blacklist
+Instead, use rd.driver.blacklist option on second kernel to blacklist
a certain module. One can edit /etc/sysconfig/kdump.conf and edit
KDUMP_COMMANDLINE_APPEND to pass kernel command line options. Refer
to dracut.cmdline man page for more details on module blacklist option.
@@ -262,7 +253,7 @@ to dracut.cmdline man page for more details on module blacklist option.
.RE
.SH EXAMPLES
-Here is some examples for core_collector option:
+Here are some examples for core_collector option:
.PP
Core collector command format depends on dump target type. Typically for
filesystem (local/remote), core_collector should accept two arguments.
--
2.5.5
6 years, 12 months
[PATCH RFC] module-setup.sh: install usb serial driver for ttyUSB0
by Dave Young
In case one want to use usb serial console, we need to pack the usb serial
driver into kdump initramfs so that one can see the console output on the usb
console.
I only handled ttyUSB0, this is like a hard code, but it should be enough for
most cases. Also only install the driver for the ttyUSB0 device.
Tested with adding "console=ttyUSB0" in 2nd kernel commandline.
Tested latest F22 kernel, there's CONFIG_USB_SERIAL_CONSOLE=y, kdump work ok.
Signed-off-by: Dave Young <dyoung(a)redhat.com>
---
dracut-module-setup.sh | 8 ++++++++
1 file changed, 8 insertions(+)
--- kexec-tools.orig/dracut-module-setup.sh
+++ kexec-tools/dracut-module-setup.sh
@@ -626,4 +626,12 @@ installkernel() {
[ "$wdt" = "iTCO_wdt" ] && instmods lpc_ich
instmods $wdt
fi
+
+ if [ -c /dev/ttyUSB0 ]; then
+ _majmin=$(get_maj_min /dev/ttyUSB0)
+
+ _driver=$(readlink /sys/dev/char/$_majmin/device/driver)
+ _driver=$(basename $_driver)
+ instmods $_driver
+ fi
}
7 years
[PATCH v5 1/2] kdump-lib: Add get_ifcfg_filename() to get the proper ifcfg file
by Xunlei Pang
Previously, we assumed the ifcfg file of a network "interface" is
"/etc/sysconfig/network-scripts/ifcfg-<interface>", but actually
it is not the case.
For example, for network interface "enp0s25", we are able to
generate like "/etc/sysconfig/network-scripts/ifcfg-enp0s25-test"
for it via network-manager.
The "suffix" in "ifcfg-<suffix>" is actually a "configuration"
name not "interface" name, though normally we use the "interface"
name as its "configuration" name. You can refer to "man ifup"
for some detail.
So, this patch adds some assistant helpers to acquire the right
ifcfg file for an interface. Borrow some logic from script below:
"/etc/sysconfig/network-scripts/network-functions"
Signed-off-by: Xunlei Pang <xlpang(a)redhat.com>
---
v4->v5:
-Add "LC_ALL= LANG=" in get_hwaddr(), add some comments according
to Dave's suggestion.
kdump-lib.sh | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 103 insertions(+)
diff --git a/kdump-lib.sh b/kdump-lib.sh
index 4d34206..b2fd2bb 100755
--- a/kdump-lib.sh
+++ b/kdump-lib.sh
@@ -230,3 +230,106 @@ is_hostname()
fi
echo $1 | grep -q "[a-zA-Z]"
}
+
+# Copied from "/etc/sysconfig/network-scripts/network-functions"
+get_hwaddr()
+{
+ if [ -f "/sys/class/net/${1}/address" ]; then
+ awk '{ print toupper($0) }' < /sys/class/net/${1}/address
+ elif [ -d "/sys/class/net/${1}" ]; then
+ LC_ALL= LANG= ip -o link show ${1} 2>/dev/null | \
+ awk '{ print toupper(gensub(/.*link\/[^ ]* ([[:alnum:]:]*).*/,
+ "\\1", 1)); }'
+ fi
+}
+
+get_ifcfg_by_device()
+{
+ grep -E -i -l "^[[:space:]]*DEVICE=\"*${1}\"*[[:space:]]*$" \
+ /etc/sysconfig/network-scripts/ifcfg-* 2>/dev/null | head -1
+}
+
+get_ifcfg_by_hwaddr()
+{
+ grep -E -i -l "^[[:space:]]*HWADDR=\"*${1}\"*[[:space:]]*$" \
+ /etc/sysconfig/network-scripts/ifcfg-* 2>/dev/null | head -1
+}
+
+get_ifcfg_by_uuid()
+{
+ grep -E -i -l "^[[:space:]]*UUID=\"*${1}\"*[[:space:]]*$" \
+ /etc/sysconfig/network-scripts/ifcfg-* 2>/dev/null | head -1
+}
+
+get_ifcfg_by_name()
+{
+ grep -E -i -l "^[[:space:]]*NAME=\"*${1}\"*[[:space:]]*$" \
+ /etc/sysconfig/network-scripts/ifcfg-* 2>/dev/null | head -1
+}
+
+is_nm_running()
+{
+ [ "$(LANG=C nmcli -t --fields running general status 2>/dev/null)" = "running" ]
+}
+
+is_nm_handling()
+{
+ LANG=C nmcli -t --fields device,state dev status 2>/dev/null \
+ | grep -q "^\(${1}:connected\)\|\(${1}:connecting.*\)$"
+}
+
+# $1: netdev name
+get_ifcfg_nmcli()
+{
+ local nm_uuid nm_name
+ local ifcfg_file
+
+ # Get the active nmcli config name of $1
+ if is_nm_running && is_nm_handling "${1}" ; then
+ # The configuration "uuid" and "name" generated by nm is wrote to
+ # the ifcfg file as "UUID=<nm_uuid>" and "NAME=<nm_name>".
+ nm_uuid=$(LANG=C nmcli -t --fields uuid,device c show --active 2>/dev/null \
+ | grep "${1}" | head -1 | cut -d':' -f1)
+ nm_name=$(LANG=C nmcli -t --fields name,device c show --active 2>/dev/null \
+ | grep "${1}" | head -1 | cut -d':' -f1)
+ ifcfg_file=$(get_ifcfg_by_uuid "${nm_uuid}")
+ [ -z "${ifcfg_file}" ] && ifcfg_file=$(get_ifcfg_by_name "${nm_name}")
+ fi
+
+ echo -n "${ifcfg_file}"
+}
+
+# $1: netdev name
+get_ifcfg_legacy()
+{
+ local ifcfg_file
+
+ ifcfg_file="/etc/sysconfig/network-scripts/ifcfg-${1}"
+ [ -f "${ifcfg_file}" ] && echo -n "${ifcfg_file}" && return
+
+ ifcfg_file=$(get_ifcfg_by_name "${1}")
+ [ -f "${ifcfg_file}" ] && echo -n "${ifcfg_file}" && return
+
+ local hwaddr=$(get_hwaddr "${1}")
+ if [ -n "$hwaddr" ]; then
+ ifcfg_file=$(get_ifcfg_by_hwaddr "${hwaddr}")
+ [ -f "${ifcfg_file}" ] && echo -n "${ifcfg_file}" && return
+ fi
+
+ ifcfg_file=$(get_ifcfg_by_device "${1}")
+
+ echo -n "${ifcfg_file}"
+}
+
+# $1: netdev name
+# Return the ifcfg file whole name(including the path) of $1 if any.
+get_ifcfg_filename() {
+ local ifcfg_file
+
+ ifcfg_file=$(get_ifcfg_nmcli "${1}")
+ if [ -z "${ifcfg_file}" ]; then
+ ifcfg_file=$(get_ifcfg_legacy "${1}")
+ fi
+
+ echo -n "${ifcfg_file}"
+}
--
1.8.3.1
7 years
[PATCH] module-setup: Don't handle iBFT in kdump
by Minfei Huang
Lots of people complain that iSCSI disk will be brought up with software
iSCSI mode in kdump kernel, although this disk works with iBFT mode
previously in 1st kernel. In addition, kdump kernel can boot from the
disk which is brought up by software iSCSI, this may be different with
1st kernel.
To make it be consistent with 1st kernel, we should use iBFT mode to
bring iSCSI disk up, instead of software iSCSI.
There is a difference between iBFT and software iSCSI, the value of
node.discovery_type. The value of discovery_type for iBFT is fw, and
software iSCSI is send_targets.
It is safe to return immediately from kdump_setup_iscsi_device, if iBFT
mode is detected, since dracut can take care of iBFT.
Signed-off-by: Minfei Huang <mhuang(a)redhat.com>
---
dracut-module-setup.sh | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/dracut-module-setup.sh b/dracut-module-setup.sh
index 4cd7107..0a59a91 100755
--- a/dracut-module-setup.sh
+++ b/dracut-module-setup.sh
@@ -494,7 +494,11 @@ kdump_get_iscsi_initiator() {
return 1
}
-# No ibft handling yet.
+# Figure out iBFT session according to session type
+is_ibft() {
+ [ "$(kdump_iscsi_get_rec_val $1 "node.discovery_type")" = fw ]
+}
+
kdump_setup_iscsi_device() {
local path=$1
local tgt_name; local tgt_ipaddr;
@@ -517,6 +521,10 @@ kdump_setup_iscsi_device() {
return 1
fi
+ if is_ibft ${path}; then
+ return
+ fi
+
tgt_name=$(kdump_iscsi_get_rec_val ${path} "node.name")
tgt_ipaddr=$(kdump_iscsi_get_rec_val ${path} "node.conn\[0\].address")
--
2.1.0
7 years
[PATCH F24] doc: fix comments in kdump.conf
by Freeman Zhang
Resolves: bz1294877
When 'default' is set to 'halt', system will halt if and ONLY if
dump fails.
Signed-off-by: Freeman Zhang <zhezhang(a)redhat.com>
Reported-by: Donald Berry <dberry(a)redhat.com>
---
kdump.conf | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/kdump.conf b/kdump.conf
index 54b581d..1195b38 100644
--- a/kdump.conf
+++ b/kdump.conf
@@ -98,15 +98,14 @@
# dependent modules will automatically be included.
#
# default <reboot | halt | poweroff | shell | dump_to_rootfs>
-# - Action to preform in case dumping to intended target
+# - Action to perform in case dumping to intended target
# fails. If no default action is specified, "reboot"
# is assumed default.
# reboot: If the default action is reboot simply reboot
# the system and loose the core that you are
# trying to retrieve.
# halt: If the default action is halt, then simply
-# halt the system after attempting to capture
-# a vmcore, regardless of success or failure.
+# halt the system after dump failure.
# poweroff: The system will be powered down
# shell: If the default action is shell, then drop to
# an shell session inside the initramfs from
--
2.5.5
7 years
[PATCH 1/2] kdump.conf: Support passing special mount information via "dracut_args"
by Xunlei Pang
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"
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
+ 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
7 years
[PATCH v4 1/2] kdump-lib: Add get_ifcfg_filename() to get the proper ifcfg file
by Xunlei Pang
Previously, we assumed the ifcfg file of a network "interface" is
"/etc/sysconfig/network-scripts/ifcfg-<interface>", but actually
it is not the case.
For example, for network interface "enp0s25", we are able to
generate like "/etc/sysconfig/network-scripts/ifcfg-enp0s25-test"
for it via network-manager.
The "suffix" in "ifcfg-<suffix>" is actually a "configuration"
name not "interface" name, though normally we use the "interface"
name as its "configuration" name. You can refer to "man ifup"
for some detail.
So, this patch adds some assistant helpers to acquire the right
ifcfg file for an interface. Borrow some logic from script below:
"/etc/sysconfig/network-scripts/network-functions"
Signed-off-by: Xunlei Pang <xlpang(a)redhat.com>
---
kdump-lib.sh | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 102 insertions(+)
diff --git a/kdump-lib.sh b/kdump-lib.sh
index 4d34206..90913c5 100755
--- a/kdump-lib.sh
+++ b/kdump-lib.sh
@@ -230,3 +230,105 @@ is_hostname()
fi
echo $1 | grep -q "[a-zA-Z]"
}
+
+get_hwaddr()
+{
+ if [ -f "/sys/class/net/${1}/address" ]; then
+ awk '{ print toupper($0) }' < /sys/class/net/${1}/address
+ elif [ -d "/sys/class/net/${1}" ]; then
+ ip -o link show ${1} 2>/dev/null | \
+ awk '{ print toupper(gensub(/.*link\/[^ ]* ([[:alnum:]:]*).*/,
+ "\\1", 1)); }'
+ fi
+}
+
+get_ifcfg_by_device()
+{
+ grep -E -i -l "^[[:space:]]*DEVICE=\"*${1}\"*[[:space:]]*$" \
+ /etc/sysconfig/network-scripts/ifcfg-* 2>/dev/null | head -1
+}
+
+get_ifcfg_by_hwaddr()
+{
+ grep -E -i -l "^[[:space:]]*HWADDR=\"*${1}\"*[[:space:]]*$" \
+ /etc/sysconfig/network-scripts/ifcfg-* 2>/dev/null | head -1
+}
+
+get_ifcfg_by_uuid()
+{
+ grep -E -i -l "^[[:space:]]*UUID=\"*${1}\"*[[:space:]]*$" \
+ /etc/sysconfig/network-scripts/ifcfg-* 2>/dev/null | head -1
+}
+
+get_ifcfg_by_name()
+{
+ grep -E -i -l "^[[:space:]]*NAME=\"*${1}\"*[[:space:]]*$" \
+ /etc/sysconfig/network-scripts/ifcfg-* 2>/dev/null | head -1
+}
+
+is_nm_running()
+{
+ [ "$(LANG=C nmcli -t --fields running general status 2>/dev/null)" = "running" ]
+}
+
+is_nm_handling()
+{
+ LANG=C nmcli -t --fields device,state dev status 2>/dev/null \
+ | grep -q "^\(${1}:connected\)\|\(${1}:connecting.*\)$"
+}
+
+# $1: netdev name
+get_ifcfg_nmcli()
+{
+ local nm_uuid nm_name
+ local ifcfg_file
+
+ # Get the active nmcli config name of $1
+ if is_nm_running && is_nm_handling "${1}" ; then
+ # The configuration "uuid" and "name" generated by nm is wrote to
+ # the ifcfg file as "UUID=<nm_uuid>" and "NAME=<nm_name>".
+ nm_uuid=$(LANG=C nmcli -t --fields uuid,device c show --active 2>/dev/null \
+ | grep "${1}" | head -1 | cut -d':' -f1)
+ nm_name=$(LANG=C nmcli -t --fields name,device c show --active 2>/dev/null \
+ | grep "${1}" | head -1 | cut -d':' -f1)
+ ifcfg_file=$(get_ifcfg_by_uuid "${nm_uuid}")
+ [ -z "${ifcfg_file}" ] && ifcfg_file=$(get_ifcfg_by_name "${nm_name}")
+ fi
+
+ echo -n "${ifcfg_file}"
+}
+
+# $1: netdev name
+get_ifcfg_legacy()
+{
+ local ifcfg_file
+
+ ifcfg_file="/etc/sysconfig/network-scripts/ifcfg-${1}"
+ [ -f "${ifcfg_file}" ] && echo -n "${ifcfg_file}" && return
+
+ ifcfg_file=$(get_ifcfg_by_name "${1}")
+ [ -f "${ifcfg_file}" ] && echo -n "${ifcfg_file}" && return
+
+ local hwaddr=$(get_hwaddr "${1}")
+ if [ -n "$hwaddr" ]; then
+ ifcfg_file=$(get_ifcfg_by_hwaddr "${hwaddr}")
+ [ -f "${ifcfg_file}" ] && echo -n "${ifcfg_file}" && return
+ fi
+
+ ifcfg_file=$(get_ifcfg_by_device "${1}")
+
+ echo -n "${ifcfg_file}"
+}
+
+# $1: netdev name
+# Return the ifcfg file whole name(including the path) of $1 if any.
+get_ifcfg_filename() {
+ local ifcfg_file
+
+ ifcfg_file=$(get_ifcfg_nmcli "${1}")
+ if [ -z "${ifcfg_file}" ]; then
+ ifcfg_file=$(get_ifcfg_legacy "${1}")
+ fi
+
+ echo -n "${ifcfg_file}"
+}
--
1.8.3.1
7 years
[RFC PATCH v3] kdump.conf: Support passing special mount information via "dracut_args"
by Xunlei Pang
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
7 years
Re: [RFC PATCH v2] kdump.conf: Support passing special mount
information via "dracut_args"
by Xunlei Pang
On 2016/05/19 at 16:39, Dave Young wrote:
> On 05/19/16 at 04:26pm, Xunlei Pang wrote:
>> On 2016/05/19 at 16:13, Dave Young wrote:
>>> On 05/19/16 at 03:45pm, 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, we will skip all the
>>>> filesystem mounting and checking things for it. So it can be used
>>>> in the above-mentioned nfs scenario and avoid creating 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 check(users are expected to ensure its correctness),
>>>> it overrides any target specified in /etc/kdump.conf.
>>>>
>>>> As an example:
>>>> dracut_args --mount "192.168.1.1:/test test nfs defaults,x-initrd.mount"
>>> Could also update the kdump howto to define the valid format of --mount?
>> Sure
>>
>>> and give an example. Should we limit it to nfs only or for all fs types?
>> The approach itself is a general implementation, I personally perfer it for all fs types.
> Ok.
>
>>>> NOTE:
>>>> 1)Only one mount information can be specified via "dracut_args".
>>>> 2)Dracut will create <mountpoint> if it doesn't exist in kdump kernel.
>>>>
>>>> Suggested-by: Dave Young <dyoung(a)redhat.com>
>>>> Signed-off-by: Xunlei Pang <xlpang(a)redhat.com>
>>>> ---
>>>> v1->v2:
>>>> -Consider "dracut_args" in is_user_configured_dump_target().
>>>> -Add dracut "nfs" module properly.
>>>> -Prohibit specifying multiple mount information via "dracut_args".
>>>>
>>>> kdump-lib.sh | 25 ++++++++++++++++++++++++-
>>>> kdumpctl | 8 +++++++-
>>>> mkdumprd | 9 +++++++++
>>>> 3 files changed, 40 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/kdump-lib.sh b/kdump-lib.sh
>>>> index fc2c036..e90fe4c 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 $(is_ssh_dump_target || is_nfs_dump_target || is_raw_dump_target \
>>>> + || is_fs_dump_target || dracut_args_contains_mount)
>>>> }
>>>>
>>>> strip_comments()
>>>> @@ -279,3 +280,25 @@ 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()
>>>> +{
>>>> + local user_dracut_args fstype
>>>> +
>>>> + user_dracut_args=$(grep ^dracut_args /etc/kdump.conf | grep "\-\-mount | head -1")
>>>> + if [[ -n "$user_dracut_args" ]]; then
>>>> + fstype=$(echo $user_dracut_args | awk -F "--mount \"" '{print $2}' | cut -d' ' -f3)
>>>> + fi
>>>> +
>>>> + echo $fstype
>>>> +}
>>>> +
>>>> diff --git a/kdumpctl b/kdumpctl
>>>> index fcc9ad0..4e9d6a4 100755
>>>> --- a/kdumpctl
>>>> +++ b/kdumpctl
>>>> @@ -236,7 +236,8 @@ 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
>>>> @@ -365,6 +366,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..2156be6 100644
>>>> --- a/mkdumprd
>>>> +++ b/mkdumprd
>>>> @@ -497,6 +497,12 @@ do
>>>> extra_modules="$extra_modules $config_val"
>>>> ;;
>>>> ext[234]|xfs|btrfs|minix|nfs)
>>>> + # Use the mount information in "dracut_args" specifed by users
>>>> + # in /etc/kdump.conf, skip further parsing.
>>>> + if dracut_args_contains_mount; then
>>>> + continue
>>> Do we allow one specify fs dump here at the same time, if no a warning here
>>> is good to tell that we will use --mount instead.
>> I'm a little worried about multiple "--mount" passed to dracut, at least one
>> I can think of now is Pratyush's recent force_rebuild patchset, it relys on
>> the first "--mount" to get the old target, old mountpoint, old fstype.
>>
>> That's why I prohibit multiple "--mount" and skip "target" in the patch.
> Understand, I agree to skip "target" but we need a warning to tell user
> or error out here, a failure maybe better.
Actually, we can skip this, kdumpctl will do check_config(), and it bails out
earlier at that place for the multiple targets cases.
Regards,
Xunlei
>
>> Regards,
>> Xunlei
>>
>>>> + fi
>>>> +
>>>> if ! findmnt $config_val >/dev/null; then
>>>> perror_exit "Dump target $config_val is probably not mounted."
>>>> fi
>>>> @@ -544,6 +550,9 @@ do
>>>> verify_core_collector "$config_val"
>>>> ;;
>>>> dracut_args)
>>>> + if [[ $(get_fstype_from_dracut_args) = nfs* ]]; then
>>>> + add_dracut_module "nfs"
>>>> + fi
>>>> add_dracut_arg $config_val
>>>> ;;
>>>> *)
>>>> --
>>>> 1.8.3.1
>>>> _______________________________________________
>>>> kexec mailing list
>>>> kexec(a)lists.fedoraproject.org
>>>> http://lists.fedoraproject.org/admin/lists/kexec@lists.fedoraproject.org
>> _______________________________________________
>> kexec mailing list
>> kexec(a)lists.fedoraproject.org
>> http://lists.fedoraproject.org/admin/lists/kexec@lists.fedoraproject.org
> Thanks
> Dave
7 years