Adds two new options to kdump.conf to be able to configure fence_kdump support for generic clusters:
fence_kdump_args <arg(s)> - Command line arguments for fence_kdump_send (it can contain 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)
Generic clusters fence_kdump configuration take precedence over older method of fence_kdump configuration for Pacemaker clusters. It means that if fence_kdump is configured using above options in kdump.conf, old Pacemaker configuration is not used even if it exists.
Bug-Url: https://bugzilla.redhat.com/1078134 Signed-off-by: Martin Perina mperina@redhat.com --- dracut-kdump.sh | 19 +++++++------ dracut-module-setup.sh | 58 ++++++++++++++++++++++++++++++++-------- kdump-in-cluster-environment.txt | 39 ++++++++++++++++++++++----- kdump-lib.sh | 9 ++++++- kdump.conf | 11 ++++++++ kdump.conf.5 | 15 +++++++++++ kdumpctl | 35 ++++++++++++++++++++++-- 7 files changed, 155 insertions(+), 31 deletions(-)
diff --git a/dracut-kdump.sh b/dracut-kdump.sh index 4bac088..cb13d92 100755 --- a/dracut-kdump.sh +++ b/dracut-kdump.sh @@ -246,6 +246,12 @@ read_kdump_conf() kdump_post) KDUMP_POST="$config_val" ;; + fence_kdump_args) + FENCE_KDUMP_ARGS="$config_val" + ;; + fence_kdump_nodes) + FENCE_KDUMP_NODES="$config_val" + ;; default) case $config_val in shell) @@ -289,20 +295,13 @@ read_kdump_conf()
fence_kdump_notify() { - local nodes - - if [ -f $FENCE_KDUMP_NODES_FILE ]; then - if [ -f $FENCE_KDUMP_CONFIG_FILE ]; then - . $FENCE_KDUMP_CONFIG_FILE - fi - - read nodes < $FENCE_KDUMP_NODES_FILE - $FENCE_KDUMP_SEND $FENCE_KDUMP_OPTS $nodes & + if [ -n "$FENCE_KDUMP_NODES" ]; then + $FENCE_KDUMP_SEND $FENCE_KDUMP_ARGS $FENCE_KDUMP_NODES & fi }
-fence_kdump_notify read_kdump_conf +fence_kdump_notify
if [ -z "$CORE_COLLECTOR" ];then CORE_COLLECTOR=$DEFAULT_CORE_COLLECTOR diff --git a/dracut-module-setup.sh b/dracut-module-setup.sh index e64bc41..5541fae 100755 --- a/dracut-module-setup.sh +++ b/dracut-module-setup.sh @@ -20,7 +20,7 @@ depends() { _dep="$_dep drm" fi
- if is_pcs_fence_kdump; then + if [ is_generic_fence_kdump -o is_pcs_fence_kdump ]; then _dep="$_dep network" fi
@@ -282,10 +282,13 @@ kdump_install_conf() { core_collector) dracut_install "${config_val%%[[:blank:]]*}" ;; + fence_kdump_nodes) + FENCE_KDUMP_NODES="$config_val" + ;; esac done < /etc/kdump.conf
- kdump_configure_fence_kdump + kdump_configure_fence_kdump "/tmp/$$-kdump.conf" inst "/tmp/$$-kdump.conf" "/etc/kdump.conf" rm -f /tmp/$$-kdump.conf } @@ -415,11 +418,8 @@ kdump_check_iscsi_targets () { } }
- -# setup fence_kdump in cluster -# setup proper network and install needed files -# also preserve '[node list]' for 2nd kernel /etc/fence_kdump_nodes -kdump_configure_fence_kdump () { +# retrieves fence_kdump nodes from Pacemaker cluster configuration +get_pcs_fence_kdump_nodes() { local nodes is_pcs_fence_kdump || return 1
@@ -437,14 +437,50 @@ kdump_configure_fence_kdump () { continue fi nodes="$nodes $nodename" + done + + echo $nodes +} + +# retrieves fence_kdump args from config file +get_pcs_fence_kdump_args() { + if [ -f $FENCE_KDUMP_CONFIG_FILE ]; then + . $FENCE_KDUMP_CONFIG_FILE + echo $FENCE_KDUMP_OPTS + fi +} + +# setup fence_kdump in cluster +# setup proper network and install needed files +kdump_configure_fence_kdump () { + local kdump_cfg_file=$1 + + if is_generic_fence_kdump; then + # fence_kdump nodes already read from kdump.conf + : + + elif is_pcs_fence_kdump; then + FENCE_KDUMP_NODES=$(get_pcs_fence_kdump_nodes) + + # set appropriate options in kdump.conf + echo "fence_kdump_nodes $FENCE_KDUMP_NODES" >> ${kdump_cfg_file} + + FENCE_KDUMP_ARGS=$(get_pcs_fence_kdump_args) + if [ -n "$FENCE_KDUMP_ARGS" ]; then + echo "fence_kdump_args $FENCE_KDUMP_ARGS" >> ${kdump_cfg_file} + fi + + else + # fence_kdump not configured + return 1 + fi
- kdump_install_net $nodename + # setup network for each node + for node in ${FENCE_KDUMP_NODES}; do + kdump_install_net $node done - echo
- echo "$nodes" > ${initdir}/$FENCE_KDUMP_NODES_FILE dracut_install $FENCE_KDUMP_SEND - dracut_install -o $FENCE_KDUMP_CONFIG_FILE }
# Install a random seed used to feed /dev/urandom diff --git a/kdump-in-cluster-environment.txt b/kdump-in-cluster-environment.txt index c27a5d7..de1eb5e 100644 --- a/kdump-in-cluster-environment.txt +++ b/kdump-in-cluster-environment.txt @@ -34,11 +34,11 @@ recovery service, fence_kdump_send will periodically send messages to all cluster nodes. When the fence_kdump agent receives a valid message from the failed nodes, fencing is complete.
-How to configure cluster environment: +How to configure Pacemaker cluster environment:
-If we want to use kdump in cluster environment, fence-agents-kdump should be -installed in every nodes in the cluster. You can achieve this via the following -command: +If we want to use kdump in Pacemaker cluster environment, fence-agents-kdump +should be installed in every nodes in the cluster. You can achieve this via +the following command:
# yum install -y fence-agents-kdump
@@ -61,6 +61,31 @@ Then enable stonith
How to configure kdump:
-Actually there is nothing special in configuration between normal kdump and -cluster environment kdump. So please refer to Kexec-Kdump-howto file for more -information. +Actually there are two ways how to configure fence_kdump support: + +1) Pacemaker based clusters + If you have successfully configured fence_kdump in Pacemaker, there is + no need to add some special configuration in kdump. So please refer to + Kexec-Kdump-howto file for more information. + +2) Generic clusters + For other types of clusters there are two configuration options in + kdump.conf which enables fence_kdump support: + + fence_kdump_nodes <node(s)> + Contains list of cluster node(s) separated by space to send + fence_kdump notification to (this option is mandatory to enable + fence_kdump) + + fence_kdump_args <arg(s)> + Command line arguments for fence_kdump_send (it can contain + all valid arguments except hosts to send notification to) + + These options will most probably be configured by your cluster software, + so please refer to your cluster documentation how to enable fence_kdump + support. + +Please be aware that these two ways cannot be combined and 2) has precedence +over 1). It means that if fence_kdump is configured using fence_kdump_nodes +and fence_kdump_args options in kdump.conf, Pacemaker configuration is not +used even if it exists. diff --git a/kdump-lib.sh b/kdump-lib.sh index 7103ba9..659ead3 100755 --- a/kdump-lib.sh +++ b/kdump-lib.sh @@ -5,7 +5,6 @@
FENCE_KDUMP_CONFIG_FILE="/etc/sysconfig/fence_kdump" FENCE_KDUMP_SEND="/usr/libexec/fence_kdump_send" -FENCE_KDUMP_NODES_FILE="/etc/fence_kdump_nodes"
is_ssh_dump_target() { @@ -38,6 +37,14 @@ is_pcs_fence_kdump() (pcs cluster cib | grep -q 'type="fence_kdump"') &> /dev/null || return 1 }
+# Check if fence_kdump is configured using kdump options +is_generic_fence_kdump() +{ + [ -x $FENCE_KDUMP_SEND ] || return 1 + + grep -q "^fence_kdump_nodes" /etc/kdump.conf +} + get_user_configured_dump_disk() { local _target diff --git a/kdump.conf b/kdump.conf index a106462..08bbe2a 100644 --- a/kdump.conf +++ b/kdump.conf @@ -123,6 +123,15 @@ # dracut_args <arg(s)> # - Pass extra dracut options when rebuilding kdump # initrd. +# +# fence_kdump_args <arg(s)> +# - Command line arguments for fence_kdump_send (it can contain +# 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). +#
#raw /dev/vg/lv_kdump #ext4 /dev/vg/lv_kdump @@ -141,3 +150,5 @@ core_collector makedumpfile -l --message-level 1 -d 31 #default shell #force_rebuild 1 #dracut_args --omit-drivers "cfg80211 snd" --add-drivers "ext2 ext3" +#fence_kdump_args -p 7410 -f auto -c 0 -i 10 +#fence_kdump_nodes node1 node2 diff --git a/kdump.conf.5 b/kdump.conf.5 index 7eaf9dd..69628bd 100644 --- a/kdump.conf.5 +++ b/kdump.conf.5 @@ -177,6 +177,21 @@ Kdump uses dracut to generate initramfs for second kernel. This option allows a user to pass arguments to dracut directly. .RE
+ +.B fence_kdump_args <arg(s)> +.RS +Command line arguments for fence_kdump_send (it can contain all valid +arguments except hosts to send notification to). +.RE + + +.B fence_kdump_nodes <node(s)> +.RS +List of cluster node(s) separated by space to send fence_kdump notification +to (this option is mandatory to enable fence_kdump). +.RE + + .SH DEPRECATED OPTIONS
.B net <nfs mount>|user@server diff --git a/kdumpctl b/kdumpctl index 8aacf4e..7450ee2 100755 --- a/kdumpctl +++ b/kdumpctl @@ -166,7 +166,7 @@ function check_config() case "$config_opt" in #* | "") ;; - raw|ext2|ext3|ext4|minix|btrfs|xfs|nfs|ssh|sshkey|path|core_collector|kdump_post|kdump_pre|extra_bins|extra_modules|default|force_rebuild|dracut_args) + raw|ext2|ext3|ext4|minix|btrfs|xfs|nfs|ssh|sshkey|path|core_collector|kdump_post|kdump_pre|extra_bins|extra_modules|default|force_rebuild|dracut_args|fence_kdump_args|fence_kdump_nodes) [ -z "$config_val" ] && { echo "Invalid kdump config value for option $config_opt." return 1; @@ -249,7 +249,7 @@ function check_rebuild() EXTRA_BINS="$EXTRA_BINS $CHECK_FILES" files="$KDUMP_CONFIG_FILE $kdump_kernel $EXTRA_BINS"
- if [ -f $FENCE_KDUMP_CONFIG_FILE ]; then + if [ !is_generic_fence_kdump -a -f $FENCE_KDUMP_CONFIG_FILE ]; then files="$files $FENCE_KDUMP_CONFIG_FILE" fi
@@ -573,6 +573,31 @@ function check_kdump_feasibility() fi }
+function check_fence_kdump_config() +{ + local hostname=`hostname` + while read config_opt config_val; do + # remove inline comments after the end of a directive. + config_val=$(strip_comments $config_val) + case "$config_opt" in + fence_kdump_nodes) + FENCE_KDUMP_NODES="$config_val" + ;; + *) + ;; + esac + done < $KDUMP_CONFIG_FILE + + for node in $FENCE_KDUMP_NODES; do + if [ "$node" = "$hostname" ]; then + echo "Option fence_kdump_nodes cannot contain $hostname" + return 1 + fi + done + + return 0 +} + function start() { check_config @@ -609,6 +634,12 @@ function start() fi fi
+ check_fence_kdump_config + if [ $? -ne 0 ]; then + echo "Starting kdump: [FAILED]" + return 1 + fi + check_rebuild if [ $? != 0 ]; then echo "Starting kdump: [FAILED]"