[kexec-tools] Add fence_kdump support for generic clusters

WANG Chao wangchao at fedoraproject.org
Thu Apr 3 08:15:33 UTC 2014


commit 2066e5f792ecbad210cee1dc0cbdcb5b8d63b6c7
Author: Martin Perina <mperina at redhat.com>
Date:   Wed Apr 2 10:33:47 2014 +0200

    Add fence_kdump support for generic clusters
    
    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 at redhat.com>
    Acked-by: Vivek Goyal <vgoyal at redhat.com>

 dracut-kdump.sh                  |   19 ++++++------
 dracut-module-setup.sh           |   57 ++++++++++++++++++++++++++++++--------
 kdump-in-cluster-environment.txt |   39 +++++++++++++++++++++----
 kdump-lib.sh                     |    9 +++++-
 kdump.conf                       |   11 +++++++
 kdump.conf.5                     |   15 ++++++++++
 kdumpctl                         |   53 +++++++++++++++++++++++++----------
 7 files changed, 158 insertions(+), 45 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..7a6ea17 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
 
@@ -285,7 +285,7 @@ kdump_install_conf() {
         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,13 +415,9 @@ 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
 
     # get cluster nodes from cluster cib, get interface and ip address
     nodelist=`pcs cluster cib | xmllint --xpath "/cib/status/node_state/@uname" -`
@@ -437,14 +433,51 @@ 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
+    local nodes
+    local args
+
+    if is_generic_fence_kdump; then
+        nodes=$(get_option_value "fence_kdump_nodes")
+
+    elif is_pcs_fence_kdump; then
+        nodes=$(get_pcs_fence_kdump_nodes)
+
+        # set appropriate options in kdump.conf
+        echo "fence_kdump_nodes $nodes" >> ${kdump_cfg_file}
+
+        args=$(get_pcs_fence_kdump_args)
+        if [ -n "$args" ]; then
+            echo "fence_kdump_args $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 ${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 abf2eb3..831d063 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 at server>
diff --git a/kdumpctl b/kdumpctl
index 8aacf4e..9cae0c4 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;
@@ -182,26 +182,38 @@ function check_config()
 			;;
 		esac
 	done < $KDUMP_CONFIG_FILE
+	
+	check_fence_kdump_config || return 1
+
 	return 0
 }
 
-# check_pcs_fence_kdump <image timestamp>
-# return 0 if fence_kdump is configured in Pacemaker cluster and kdump initrd needs to be rebuilt
-function check_pcs_fence_kdump()
+# get_pcs_cluster_modified_files <image timestamp>
+# return list of modified file for fence_kdump modified in Pacemaker cluster
+get_pcs_cluster_modified_files()
 {
 	local image_time=$1
-	local cib_time
+	local time_stamp
+	local modified_files
 
+	is_generic_fence_kdump && return 1
 	is_pcs_fence_kdump || return 1
 
-	cib_time=`pcs cluster cib | xmllint --xpath 'string(/cib/@cib-last-written)' - | \
-		  xargs -0 date +%s --date`
+	time_stamp=`pcs cluster cib | xmllint --xpath 'string(/cib/@cib-last-written)' - | \
+		xargs -0 date +%s --date`
 
-	if [ -z $cib_time -o $cib_time -le $image_time ]; then
-		return 1
+	if [ -n $time_stamp -a $time_stamp -gt $image_time ]; then
+		modified_files="cluster-cib"
 	fi
 
-	return 0
+	if [ -f $FENCE_KDUMP_CONFIG_FILE ]; then
+		time_stamp=`stat -c "%Y" $FENCE_KDUMP_CONFIG_FILE`
+		if [ "$time_stamp" -gt "$image_time" ]; then
+			modified_files="$modified_files $FENCE_KDUMP_CONFIG_FILE"
+		fi
+	fi
+
+	echo $modified_files
 }
 
 function check_rebuild()
@@ -240,7 +252,7 @@ function check_rebuild()
 	fi
 
 	#also rebuild when Pacemaker cluster conf is changed and fence kdump is enabled.
-	check_pcs_fence_kdump $image_time && modified_files="cluster-cib"
+	modified_files=$(get_pcs_cluster_modified_files $image_time)
 
 	EXTRA_BINS=`grep ^kdump_post $KDUMP_CONFIG_FILE | cut -d\  -f2`
 	CHECK_FILES=`grep ^kdump_pre $KDUMP_CONFIG_FILE | cut -d\  -f2`
@@ -249,10 +261,6 @@ function check_rebuild()
 	EXTRA_BINS="$EXTRA_BINS $CHECK_FILES"
 	files="$KDUMP_CONFIG_FILE $kdump_kernel $EXTRA_BINS"
 
-	if [ -f $FENCE_KDUMP_CONFIG_FILE ]; then
-		files="$files $FENCE_KDUMP_CONFIG_FILE"
-	fi
-
 	check_exist "$files" && check_executable "$EXTRA_BINS"
 	[ $? -ne 0 ] && return 1
 
@@ -573,6 +581,21 @@ function check_kdump_feasibility()
 	fi
 }
 
+function check_fence_kdump_config()
+{
+	local hostname=`hostname`
+	local nodes=$(get_option_value "fence_kdump_nodes")
+
+	for node in $nodes; do
+		if [ "$node" = "$hostname" ]; then
+			echo "Option fence_kdump_nodes cannot contain $hostname"
+			return 1
+		fi
+	done
+
+	return 0
+}
+
 function start()
 {
 	check_config


More information about the scm-commits mailing list