[PATCH 6/6] fence_kdump for generic clusters v3: Add fence_kdump support for generic clusters

Vivek Goyal vgoyal at redhat.com
Thu Mar 27 21:40:15 UTC 2014


On Wed, Mar 26, 2014 at 10:24:12AM +0100, Martin Perina wrote:
> 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)
> 
> Bug-Url: https://bugzilla.redhat.com/1079821
> Signed-off-by: Martin Perina <mperina at redhat.com>
> ---
>  dracut-kdump.sh                  | 19 ++++++-----
>  dracut-module-setup.sh           | 69 ++++++++++++++++++++++++++--------------
>  kdump-in-cluster-environment.txt | 35 +++++++++++++++++---
>  kdump-lib.sh                     |  8 +++++
>  kdump.conf                       | 11 +++++++
>  kdump.conf.5                     | 15 +++++++++
>  kdumpctl                         |  2 +-
>  7 files changed, 119 insertions(+), 40 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 7951121..cba3539 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
>  
> @@ -263,7 +263,8 @@ kdump_install_net() {
>  
>  #install kdump.conf and what user specifies in kdump.conf
>  kdump_install_conf() {
> -    sed -ne '/^#/!p' /etc/kdump.conf > /tmp/$$-kdump.conf
> +    # filter comments and fence_kdump settings
> +    sed -ne '/^#\|^fence_kdump/!p' /etc/kdump.conf > /tmp/$$-kdump.conf

Why should we get rid of fence_kdump options? 

Even if we have to please do it in two lines. Retain the old line of
getting rid of comments. It is just easier to read.

>  
>      while read config_opt config_val;
>      do
> @@ -282,10 +283,16 @@ kdump_install_conf() {
>          core_collector)
>              dracut_install "${config_val%%[[:blank:]]*}"
>              ;;
> +        fence_kdump_args)
> +            FENCE_KDUMP_ARGS="$config_val"
> +            ;;
> +        fence_kdump_nodes)
> +            FENCE_KDUMP_NODES="$config_val"
> +            ;;
>          esac
>      done < /etc/kdump.conf
>  
> -    kdump_check_fence_kdump
> +    kdump_check_fence_kdump "/tmp/$$-kdump.conf"
>      inst "/tmp/$$-kdump.conf" "/etc/kdump.conf"
>      rm -f /tmp/$$-kdump.conf
>  }
> @@ -431,33 +438,47 @@ get_list_of_nodes_to_notify() {
>  
>  # setup fence_kdump in cluster
>  # setup proper network and install needed files
> -# also preserve '[node list]' for 2nd kernel /etc/fence_kdump_nodes
> +# save fence_kdump settings to kdump config file if fence_kdump is configured
>  kdump_check_fence_kdump () {

Can we rename above function to kdump_configure_fence_kdump().

> -    local nodes
> -    is_pcs_fence_kdump || return 1
> +    local kdump_cfg_file=$1
> +
> +    if [ -z "$FENCE_KDUMP_NODES" ]; then

Why do we need to check for zero FENE_KDUMP_NODES? Will following call
of is_pcs_fence_kdump() not take care of it.

> +        if is_pcs_fence_kdump; then
> +            # get cluster nodes from cluster cib, get interface and ip address
> +            nodelist=`pcs cluster cib | xmllint --xpath "/cib/status/node_state/@uname" -`
> +
> +            # nodelist is formed as 'uname="node1" uname="node2" ... uname="nodeX"'
> +            # we need to convert each to node1, node2 ... nodeX in each iteration
> +            for node in ${nodelist}; do
> +                # convert $node from 'uname="nodeX"' to 'nodeX'
> +                eval $node
> +                FENCE_KDUMP_NODES="$FENCE_KDUMP_NODES $uname"
> +            done
> +        fi
> +    fi

Can we move this code in a function. In general how about following
structure.

kdump_configure_fence_kdump()
{
	if !is_generic_fence_kdump || !is_pcs_fence_kdump
		return;

	if is_generic_fence_kdump;then
		nodes = get_generic_fence_kdump_nodes();
	else
		nodes = get_pcs_fence_kdump_nodes;

	for node in $nodes
		kdump_install_net $node

	dracut_install $FENCE_KDUMP_SEND

	/* Take care of installing pcs cluster nodes in kdump.conf */
	if is_pcs_fence_kdump
		install_nodes_in_kdump_conf;
}

And we should not have to modify /etc/kdump.conf in case of generic
cluster. Nodes are already configured by user.

If you like in kdumpctl, you can go through that list and do some error
checking making sure host is not listed as node to notify.

>  
> -    # get cluster nodes from cluster cib, get interface and ip address
> -    nodelist=`pcs cluster cib | xmllint --xpath "/cib/status/node_state/@uname" -`
> +    FENCE_KDUMP_NODES=$( get_list_of_nodes_to_notify "$FENCE_KDUMP_NODES" )
>  
> -    # nodelist is formed as 'uname="node1" uname="node2" ... uname="nodeX"'
> -    # we need to convert each to node1, node2 ... nodeX in each iteration
> -    for node in ${nodelist}; do
> -        # convert $node from 'uname="nodeX"' to 'nodeX'
> -        eval $node
> -        nodes="$nodes $uname"
> -    done
> +    if [ -n "$FENCE_KDUMP_NODES" ]; then
> +        # setup network to reach each node
> +        for node in ${FENCE_KDUMP_NODES}; do
> +            kdump_install_net $node
> +        done
>  
> -    nodes=$( get_list_of_nodes_to_notify "$nodes" )
> +        dracut_install $FENCE_KDUMP_SEND
>  
> -    # setup network to reach each node
> -    for node in ${nodes}; do
> -        kdump_install_net $node
> -    done
> -    echo
> +        echo "fence_kdump_nodes $FENCE_KDUMP_NODES" >> ${kdump_cfg_file}
>  
> -    echo "$nodes" > ${initdir}/$FENCE_KDUMP_NODES_FILE
> -    dracut_install $FENCE_KDUMP_SEND
> -    dracut_install -o $FENCE_KDUMP_CONFIG_FILE
> +        if [ -z "$FENCE_KDUMP_ARGS" ]; then
> +            if [ -f $FENCE_KDUMP_CONFIG_FILE ]; then
> +                . $FENCE_KDUMP_CONFIG_FILE
> +                FENCE_KDUMP_ARGS=$FENCE_KDUMP_OPTS

In fedora we should be able to change the behavior to enforce pcs users 
to specify options in kdump.conf instead of a file. I don't think any
tool saves options in a file? Does it?

> +            fi
> +        fi
> +        if [ -n "$FENCE_KDUMP_ARGS" ]; then
> +            echo "fence_kdump_options $FENCE_KDUMP_ARGS" >> ${kdump_cfg_file}
> +        fi
> +    fi
>  }
>  
>  # 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..46c8614 100644
> --- a/kdump-in-cluster-environment.txt
> +++ b/kdump-in-cluster-environment.txt
> @@ -34,9 +34,9 @@ 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 
> +If we want to use kdump in Pacemaker cluster, fence-agents-kdump should be 
>  installed in every nodes in the cluster. You can achieve this via the following 
>  command:
>  
> @@ -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.

Doesn't user need to specify options to fence_kdump_send in
/etc/sysconfig/fence_kdump* file?

> +
> +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): if you specify fence_kdump_nodes option, it will be used to configure
> +fence_kdump even if you configured fence_kdump in Pacemaker cluster!

So for the vdsm case, don't we have fence_kdump running somewhere which
receives messages from fence_kdump_send.

> +
> diff --git a/kdump-lib.sh b/kdump-lib.sh
> index 6f8b991..bbaba64 100755
> --- a/kdump-lib.sh
> +++ b/kdump-lib.sh
> @@ -38,6 +38,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 3058171..6e02328 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;
> -- 
> 1.8.3.1


More information about the kexec mailing list