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

Martin Perina mperina at redhat.com
Fri Mar 28 10:22:46 UTC 2014



----- Original Message -----
> From: "Vivek Goyal" <vgoyal at redhat.com>
> To: "Martin Perina" <mperina at redhat.com>
> Cc: kexec at lists.fedoraproject.org
> Sent: Thursday, March 27, 2014 10:40:15 PM
> Subject: Re: [PATCH 6/6] fence_kdump for generic clusters v3: Add fence_kdump support for generic clusters
> 
> 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?

Because we have to check if it doesn't contain hostname. But as mentioned
below, I will move hostname check to kdumpctl so this won't be needed at all.

> 
> 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().

OK

> 
> > -    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.

Configuration using fence_kdump_nodes option in kdump.conf has higher priority,
so when it's configured, we will ignore old Pacemaker configuration

> 
> > +        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;
> }
> 

OK, I will fix this

> 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.

Ok, I will move the hostname check to kdumpctl

> 
> >  
> > -    # 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?

/etc/sysconfig/fence_kdump is needed only, if user want to change defaults
(port, protocol, timeout).

> 
> > +
> > +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.

Yes, configuration of this listener will be part of oVirt, but it doesn't
have any direct impact on kdump configuration.

> 
> > +
> > 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