Hi,
I recently discovered that the Linux-HA's Filesystem OCF resource agent
doesn't work with GlusterFS. First, it needs "glusterfs" to be added to
the list of non-block-device filesystems. Second, it fails the
/proc/filesystems sanity check because it uses fuse. There may be
additional issues.
Since I already have all my GlusterFS mount configurations stored in
/etc/fstab (with noauto), I find it annoying that these setting need to
be duplicated in cib.xml, and then the Filesystem agent needs to be
modified to specially handle GlusterFS. Thus, I copied Filesystem,
ripped out most of the code, and renamed it DumbFstabFilesystem. This
version takes just the mount point as a parameter, and it doesn't do
much of its own sanity checks other than making sure the mount point
exists (which perhaps is still superfluous). I'm pasting it here in
case anyone else would find it useful. I based it off the
2.1.3-3.el5.centos version.
-David
#!/bin/sh
#
# Support: [email protected]
# License: GNU General Public License (GPL)
#
# DumbFstabFilesystem
# Description: Manages a filesystem, relying on /etc/fstab to be
properly configured.
#
# usage: ./DumbFstabFilesystem
{start|stop|status|monitor|validate-all|meta-data}
#
# OCF parameters are as below:
# OCF_RESKEY_directory
#
#OCF_RESKEY_directory : the mount point for the filesystem
#
#
# Put this filesystem in /etc/fstab.
#
#######################################################################
# Initialization:
. ${OCF_ROOT}/resource.d/heartbeat/.ocf-shellfuncs
#######################################################################
HOSTOS=`uname`
usage() {
cat <<-EOT
usage: $0 {start|stop|status|monitor|validate-all|meta-data}
EOT
}
meta_data() {
cat <<END
<?xml version="1.0"?>
<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
<resource-agent name="DumbFstabFilesystem">
<version>1.0</version>
<longdesc lang="en">
Resource script for DumbFstabFilesystem. It manages a filesystem,
relying on /etc/fstab to be properly configured.
</longdesc>
<shortdesc lang="en">DumbFstabFilesystem resource agent</shortdesc>
<parameters>
<parameter name="directory" required="1">
<longdesc lang="en">
The mount point for the filesystem.
</longdesc>
<shortdesc lang="en">mount point</shortdesc>
<content type="string" default="" />
</parameter>
</parameters>
<actions>
<action name="start" timeout="60" />
<action name="stop" timeout="60" />
<action name="notify" timeout="60" />
<action name="monitor" depth="0" timeout="40" interval="20"
start-delay="10" />
<action name="validate-all" timeout="5" />
<action name="meta-data" timeout="5" />
</actions>
</resource-agent>
END
}
# Take advantage of /etc/mtab if present, use portable mount command
# otherwise. Normalize format to "dev mountpoint fstype".
list_mounts() {
if [ -f "/etc/mtab" -a -r "/etc/mtab" ]; then
cut -d' ' -f1,2,3 </etc/mtab
else
$MOUNT | cut -d' ' -f1,3,5
fi
}
# Lists all filesystems potentially mounted under a given path,
# excluding the path itself.
list_submounts() {
list_mounts | grep " $1/" | cut -d' ' -f2 | sort -r
}
#
# START: Start up the filesystem
#
Filesystem_start()
{
# See if the device is already mounted.
if Filesystem_status >/dev/null 2>&1 ; then
ocf_log info "Filesystem $MOUNTPOINT is already mounted."
return $OCF_SUCCESS
fi
# Check the filesystem & auto repair.
# NOTE: Some filesystem types don't need this step... Please modify
# accordingly
if [ ! -d "$MOUNTPOINT" ] ; then
ocf_log err "Couldn't find directory [$MOUNTPOINT] to use as a
mount point"
exit $OCF_ERR_ARGS
fi
# Mount the filesystem.
$MOUNT $MOUNTPOINT
if [ $? -ne 0 ]; then
ocf_log err "Couldn't mount filesystem on $MOUNTPOINT"
return $OCF_ERR_GENERIC
fi
return 0
}
# end of Filesystem_start
#
# STOP: Unmount the filesystem
#
Filesystem_stop()
{
# See if the device is currently mounted
Filesystem_status >/dev/null 2>&1
if [ $? -eq $OCF_NOT_RUNNING ]; then
# Already unmounted, wonderful.
rc=$OCF_SUCCESS
else
# For networked filesystems, we might want to add -f
# Umount all sub-filesystems mounted under $MOUNTPOINT/ too.
for SUB in `list_submounts $MOUNTPOINT` $MOUNTPOINT; do
ocf_log info "Trying to unmount $MOUNTPOINT"
for sig in SIGTERM SIGTERM SIGTERM SIGKILL SIGKILL SIGKILL; do
if $UMOUNT $SUB ; then
rc=$OCF_SUCCESS
ocf_log info "unmounted $SUB successfully"
break
else
rc=$OCF_ERR_GENERIC
ocf_log err "Couldn't unmount $SUB; trying cleanup
with $sig"
# fuser returns a non-zero return code if none of the
# specified files is accessed or in case of a fatal
# error.
if [ "X${HOSTOS}" = "XOpenBSD" ];then
PIDS=`fstat | grep ${SUB} | awk '{print $3}'`
for PID in ${PIDS};do
kill -9 ${PID}
ocf_log info "Sent kill -9 to ${PID}"
done
else
if $FUSER -$sig -m -k $SUB ; then
ocf_log info "Some processes on $SUB were
signalled"
else
ocf_log info "No processes on $SUB were
signalled"
fi
fi
sleep 1
fi
done
if [ $rc -ne $OCF_SUCCESS ]; then
ocf_log err "Couldn't unmount $SUB, giving up!"
fi
done
fi
return $rc
}
# end of Filesystem_stop
#
# STATUS: is the filesystem mounted or not?
#
Filesystem_status()
{
if list_mounts | grep -q " $MOUNTPOINT " >/dev/null 2>&1; then
rc=$OCF_SUCCESS
msg="$MOUNTPOINT is mounted (running)"
else
rc=$OCF_NOT_RUNNING
msg="$MOUNTPOINT is unmounted (stopped)"
fi
# Special case "monitor" to check whether the UUID cached and
# on-disk still match?
case "$OP" in
status) ocf_log info "$msg";;
esac
return $rc
}
# end of Filesystem_status
#
# VALIDATE_ALL: Are the instance parameters valid?
# FIXME!! The only part that's useful is the return code.
# This code always returns $OCF_SUCCESS (!)
#
Filesystem_validate_all()
{
if [ -n $MOUNTPOINT -a ! -d $MOUNTPOINT ]; then
ocf_log warn "Mountpoint $MOUNTPOINT does not exist"
fi
return $OCF_SUCCESS
}
# Check the arguments passed to this script
if [ $# -ne 1 ]; then
usage
exit $OCF_ERR_ARGS
fi
# Check the OCF_RESKEY_ environment variables...
OP=$1
# These operations do not require instance parameters
case $OP in
meta-data) meta_data
exit $OCF_SUCCESS
;;
usage) usage
exit $OCF_SUCCESS
;;
esac
# Normalize instance parameters:
# It is possible that OCF_RESKEY_directory has one or even multiple
trailing "/".
# But the output of `mount` and /proc/mounts do not.
if [ -z "$OCF_RESKEY_directory" ]; then
ocf_log err "Please specify the directory"
exit $OCF_ERR_ARGS
else
MOUNTPOINT=$(echo $OCF_RESKEY_directory | sed 's/\/*$//')
: ${MOUNTPOINT:=/}
# At this stage, $MOUNTPOINT does not contain trailing "/" unless it
is "/"
# TODO: / mounted via Filesystem sounds dangerous. On stop, we'll
# kill the whole system. Is that a good idea?
fi
# Check to make sure the utilites are found
if [ "X${HOSTOS}" != "XOpenBSD" ];then
check_binary $FUSER
fi
check_binary $MOUNT
check_binary $UMOUNT
if [ "$OP" != "monitor" ]; then
ocf_log info "Running $OP on $MOUNTPOINT"
fi
# These operations do not require the clone checking + OCFS2
# initialization.
case $OP in
status|monitor) Filesystem_status
exit $?
;;
validate-all) Filesystem_validate_all
exit $?
;;
stop) Filesystem_stop
exit $?
;;
start) Filesystem_start
;;
notify) exit $OCF_SUCCESS
;;
*) usage
exit $OCF_ERR_UNIMPLEMENTED
;;
esac
exit $?
_______________________________________________
Linux-HA mailing list
[email protected]
http://lists.linux-ha.org/mailman/listinfo/linux-ha
See also: http://linux-ha.org/ReportingProblems