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@redhat.com>
Acked-by: Vivek Goyal <vgoyal@redhat.com>
This commit is contained in:
Martin Perina 2014-04-02 10:33:47 +02:00 committed by WANG Chao
parent b8d586dd59
commit 2066e5f792
7 changed files with 159 additions and 46 deletions

View File

@ -246,6 +246,12 @@ read_kdump_conf()
kdump_post) kdump_post)
KDUMP_POST="$config_val" KDUMP_POST="$config_val"
;; ;;
fence_kdump_args)
FENCE_KDUMP_ARGS="$config_val"
;;
fence_kdump_nodes)
FENCE_KDUMP_NODES="$config_val"
;;
default) default)
case $config_val in case $config_val in
shell) shell)
@ -289,20 +295,13 @@ read_kdump_conf()
fence_kdump_notify() fence_kdump_notify()
{ {
local nodes if [ -n "$FENCE_KDUMP_NODES" ]; then
$FENCE_KDUMP_SEND $FENCE_KDUMP_ARGS $FENCE_KDUMP_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 &
fi fi
} }
fence_kdump_notify
read_kdump_conf read_kdump_conf
fence_kdump_notify
if [ -z "$CORE_COLLECTOR" ];then if [ -z "$CORE_COLLECTOR" ];then
CORE_COLLECTOR=$DEFAULT_CORE_COLLECTOR CORE_COLLECTOR=$DEFAULT_CORE_COLLECTOR

View File

@ -20,7 +20,7 @@ depends() {
_dep="$_dep drm" _dep="$_dep drm"
fi fi
if is_pcs_fence_kdump; then if [ is_generic_fence_kdump -o is_pcs_fence_kdump ]; then
_dep="$_dep network" _dep="$_dep network"
fi fi
@ -285,7 +285,7 @@ kdump_install_conf() {
esac esac
done < /etc/kdump.conf done < /etc/kdump.conf
kdump_configure_fence_kdump kdump_configure_fence_kdump "/tmp/$$-kdump.conf"
inst "/tmp/$$-kdump.conf" "/etc/kdump.conf" inst "/tmp/$$-kdump.conf" "/etc/kdump.conf"
rm -f /tmp/$$-kdump.conf rm -f /tmp/$$-kdump.conf
} }
@ -415,13 +415,9 @@ kdump_check_iscsi_targets () {
} }
} }
# retrieves fence_kdump nodes from Pacemaker cluster configuration
# setup fence_kdump in cluster get_pcs_fence_kdump_nodes() {
# setup proper network and install needed files
# also preserve '[node list]' for 2nd kernel /etc/fence_kdump_nodes
kdump_configure_fence_kdump () {
local nodes local nodes
is_pcs_fence_kdump || return 1
# get cluster nodes from cluster cib, get interface and ip address # get cluster nodes from cluster cib, get interface and ip address
nodelist=`pcs cluster cib | xmllint --xpath "/cib/status/node_state/@uname" -` nodelist=`pcs cluster cib | xmllint --xpath "/cib/status/node_state/@uname" -`
@ -437,14 +433,51 @@ kdump_configure_fence_kdump () {
continue continue
fi fi
nodes="$nodes $nodename" nodes="$nodes $nodename"
kdump_install_net $nodename
done done
echo
echo "$nodes" > ${initdir}/$FENCE_KDUMP_NODES_FILE 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
# setup network for each node
for node in ${nodes}; do
kdump_install_net $node
done
dracut_install $FENCE_KDUMP_SEND dracut_install $FENCE_KDUMP_SEND
dracut_install -o $FENCE_KDUMP_CONFIG_FILE
} }
# Install a random seed used to feed /dev/urandom # Install a random seed used to feed /dev/urandom

View File

@ -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 cluster nodes. When the fence_kdump agent receives a valid message from the
failed nodes, fencing is complete. 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 environment, fence-agents-kdump
installed in every nodes in the cluster. You can achieve this via the following should be installed in every nodes in the cluster. You can achieve this via
command: the following command:
# yum install -y fence-agents-kdump # yum install -y fence-agents-kdump
@ -61,6 +61,31 @@ Then enable stonith
How to configure kdump: How to configure kdump:
Actually there is nothing special in configuration between normal kdump and Actually there are two ways how to configure fence_kdump support:
cluster environment kdump. So please refer to Kexec-Kdump-howto file for more
information. 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.

View File

@ -5,7 +5,6 @@
FENCE_KDUMP_CONFIG_FILE="/etc/sysconfig/fence_kdump" FENCE_KDUMP_CONFIG_FILE="/etc/sysconfig/fence_kdump"
FENCE_KDUMP_SEND="/usr/libexec/fence_kdump_send" FENCE_KDUMP_SEND="/usr/libexec/fence_kdump_send"
FENCE_KDUMP_NODES_FILE="/etc/fence_kdump_nodes"
is_ssh_dump_target() is_ssh_dump_target()
{ {
@ -38,6 +37,14 @@ is_pcs_fence_kdump()
(pcs cluster cib | grep -q 'type="fence_kdump"') &> /dev/null || return 1 (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() get_user_configured_dump_disk()
{ {
local _target local _target

View File

@ -123,6 +123,15 @@
# dracut_args <arg(s)> # dracut_args <arg(s)>
# - Pass extra dracut options when rebuilding kdump # - Pass extra dracut options when rebuilding kdump
# initrd. # 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 #raw /dev/vg/lv_kdump
#ext4 /dev/vg/lv_kdump #ext4 /dev/vg/lv_kdump
@ -141,3 +150,5 @@ core_collector makedumpfile -l --message-level 1 -d 31
#default shell #default shell
#force_rebuild 1 #force_rebuild 1
#dracut_args --omit-drivers "cfg80211 snd" --add-drivers "ext2 ext3" #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

View File

@ -177,6 +177,21 @@ Kdump uses dracut to generate initramfs for second kernel. This option
allows a user to pass arguments to dracut directly. allows a user to pass arguments to dracut directly.
.RE .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 .SH DEPRECATED OPTIONS
.B net <nfs mount>|<user@server> .B net <nfs mount>|<user@server>

View File

@ -166,7 +166,7 @@ function check_config()
case "$config_opt" in 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" ] && { [ -z "$config_val" ] && {
echo "Invalid kdump config value for option $config_opt." echo "Invalid kdump config value for option $config_opt."
return 1; return 1;
@ -182,26 +182,38 @@ function check_config()
;; ;;
esac esac
done < $KDUMP_CONFIG_FILE done < $KDUMP_CONFIG_FILE
check_fence_kdump_config || return 1
return 0 return 0
} }
# check_pcs_fence_kdump <image timestamp> # get_pcs_cluster_modified_files <image timestamp>
# return 0 if fence_kdump is configured in Pacemaker cluster and kdump initrd needs to be rebuilt # return list of modified file for fence_kdump modified in Pacemaker cluster
function check_pcs_fence_kdump() get_pcs_cluster_modified_files()
{ {
local image_time=$1 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 is_pcs_fence_kdump || return 1
cib_time=`pcs cluster cib | xmllint --xpath 'string(/cib/@cib-last-written)' - | \ time_stamp=`pcs cluster cib | xmllint --xpath 'string(/cib/@cib-last-written)' - | \
xargs -0 date +%s --date` xargs -0 date +%s --date`
if [ -z $cib_time -o $cib_time -le $image_time ]; then if [ -n $time_stamp -a $time_stamp -gt $image_time ]; then
return 1 modified_files="cluster-cib"
fi 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() function check_rebuild()
@ -240,7 +252,7 @@ function check_rebuild()
fi fi
#also rebuild when Pacemaker cluster conf is changed and fence kdump is enabled. #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` EXTRA_BINS=`grep ^kdump_post $KDUMP_CONFIG_FILE | cut -d\ -f2`
CHECK_FILES=`grep ^kdump_pre $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" EXTRA_BINS="$EXTRA_BINS $CHECK_FILES"
files="$KDUMP_CONFIG_FILE $kdump_kernel $EXTRA_BINS" 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" check_exist "$files" && check_executable "$EXTRA_BINS"
[ $? -ne 0 ] && return 1 [ $? -ne 0 ] && return 1
@ -573,6 +581,21 @@ function check_kdump_feasibility()
fi 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() function start()
{ {
check_config check_config