mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-22 17:35:59 +03:00
f814d763c6
This patch adds new options to lvmconf: --enable-halvm (just like --enable-cluster, but configure LVM for use in HA LVM - meaning disabling lvmetad and making sure we have locking_type=1) --disable-halvm (just like --disable-cluster, but configure LVM back from HA LVM - meaning enabling lvmetad if it's enabled by default and making sure we have default locking type set) --services (causes clvmd and lvmetad services to be enabled or disabled appropriately and conforming to the changes in lvm configuration we've just made with lvmconf) --mirrorservice (in addition to clvmd and lvmetad services, also enable or disable cmirrord service appropriately; this is a separate option because cmirrord is optional and it doesn't need to be always enabled when clvmd is enabled) --startstopservices (in addition to enabling or disabling services, start and stop these services immediately) These options are supposed to help users to make their system ready for cluster with clvmd (active-active) or HA LVM (active-passive) use while lvmconf script can handle services as well so users don't need to bother about setting them manually. Also, before this patch, we hardcoded global/use_lvmetad=0 as default value in lvmconf script. Howeverm this default may change by just flipping the value in config_settings.h and we may forget to edit the lvmconf. It's better to use lvm dumpconfig --type default global/use_lvmetad to get the actual default value and use this one instead of hardcoded one.
450 lines
12 KiB
Bash
450 lines
12 KiB
Bash
#!/bin/bash
|
|
#
|
|
# Copyright (C) 2004-2009 Red Hat, Inc. All rights reserved.
|
|
#
|
|
# This file is part of the lvm2 package.
|
|
#
|
|
# This copyrighted material is made available to anyone wishing to use,
|
|
# modify, copy, or redistribute it subject to the terms and conditions
|
|
# of the GNU General Public License v.2.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software Foundation,
|
|
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
#
|
|
# Edit an lvm.conf file to adjust various properties
|
|
#
|
|
|
|
# cluster with clvmd and/or locking lib?
|
|
HANDLE_CLUSTER=0
|
|
|
|
# cluster without clvmd?
|
|
HANDLE_HALVM=0
|
|
|
|
# also enable services appropriately (lvmetad, clvmd)?
|
|
HANDLE_SERVICES=0
|
|
|
|
# also enable cmirrord service in addition?
|
|
HANDLE_MIRROR_SERVICE=0
|
|
|
|
# also start/start services in addition to enabling/disabling them?
|
|
START_STOP_SERVICES=0
|
|
|
|
function usage
|
|
{
|
|
echo "usage: $0 <command>"
|
|
echo ""
|
|
echo "Commands:"
|
|
echo "Enable clvm: --enable-cluster [--lockinglibdir <dir>] [--lockinglib <lib>]"
|
|
echo "Disable clvm: --disable-cluster"
|
|
echo "Enable halvm: --enable-halvm"
|
|
echo "Disable halvm: --disable-halvm"
|
|
echo "Set locking library: --lockinglibdir <dir> [--lockinglib <lib>]"
|
|
echo ""
|
|
echo "Global options:"
|
|
echo "Config file location: --file <configfile>"
|
|
echo "Set services: --services [--mirrorservice] [--startstopservices]"
|
|
echo ""
|
|
}
|
|
|
|
function set_default_use_lvmetad_var
|
|
{
|
|
eval $(lvm dumpconfig --type default global/use_lvmetad 2>/dev/null)
|
|
if [ "$?" != "0" ]; then
|
|
USE_LVMETAD=0
|
|
else
|
|
USE_LVMETAD=$use_lvmetad
|
|
fi
|
|
}
|
|
|
|
function parse_args
|
|
{
|
|
while [ -n "$1" ]; do
|
|
case $1 in
|
|
--enable-cluster)
|
|
LOCKING_TYPE=3
|
|
USE_LVMETAD=0
|
|
HANDLE_CLUSTER=1
|
|
shift
|
|
;;
|
|
--disable-cluster)
|
|
LOCKING_TYPE=1
|
|
set_default_use_lvmetad_var
|
|
HANDLE_CLUSTER=1
|
|
shift
|
|
;;
|
|
--enable-halvm)
|
|
LOCKING_TYPE=1
|
|
USE_LVMETAD=0
|
|
HANDLE_HALVM=1
|
|
shift
|
|
;;
|
|
--disable-halvm)
|
|
LOCKING_TYPE=1
|
|
set_default_use_lvmetad_var
|
|
HANDLE_HALVM=1
|
|
shift
|
|
;;
|
|
--lockinglibdir)
|
|
if [ -n "$2" ]; then
|
|
LOCKINGLIBDIR=$2
|
|
shift 2
|
|
else
|
|
usage
|
|
exit 1
|
|
fi
|
|
HANDLE_CLUSTER=1
|
|
;;
|
|
--lockinglib)
|
|
if [ -n "$2" ]; then
|
|
LOCKINGLIB=$2
|
|
shift 2
|
|
else
|
|
usage
|
|
exit 1
|
|
fi
|
|
HANDLE_CLUSTER=1
|
|
;;
|
|
--file)
|
|
if [ -n "$2" ]; then
|
|
CONFIGFILE=$2
|
|
shift 2
|
|
else
|
|
usage
|
|
exit 1
|
|
fi
|
|
;;
|
|
--services)
|
|
HANDLE_SERVICES=1
|
|
shift
|
|
;;
|
|
--mirrorservice)
|
|
HANDLE_MIRROR_SERVICE=1
|
|
shift
|
|
;;
|
|
--startstopservices)
|
|
START_STOP_SERVICES=1
|
|
shift
|
|
;;
|
|
*)
|
|
usage
|
|
exit 1
|
|
esac
|
|
done
|
|
}
|
|
|
|
function validate_args
|
|
{
|
|
[ -z "$CONFIGFILE" ] && CONFIGFILE="/etc/lvm/lvm.conf"
|
|
|
|
if [ ! -f "$CONFIGFILE" ]
|
|
then
|
|
echo "$CONFIGFILE does not exist"
|
|
exit 10
|
|
fi
|
|
|
|
if [ "$HANDLE_CLUSTER" = "1" -a "$HANDLE_HALVM" = "1" ]; then
|
|
echo "Either HA LVM or cluster method may be used at one time"
|
|
exit 18
|
|
fi
|
|
|
|
if [ "$HANDLE_SERVICES" = "0" ]; then
|
|
if [ "$HANDLE_MIRROR_SERVICE" = "1" ]; then
|
|
echo "--mirrorservice may be used only with --services"
|
|
exit 19
|
|
fi
|
|
if [ "$START_STOP_SERVICES" = "1" ]; then
|
|
echo "--startstopservices may be used only with --services"
|
|
exit 19
|
|
fi
|
|
fi
|
|
|
|
if [ -z "$LOCKING_TYPE" ] && [ -z "$LOCKINGLIBDIR" ]; then
|
|
usage
|
|
exit 1
|
|
fi
|
|
|
|
if [ -n "$LOCKINGLIBDIR" ]; then
|
|
|
|
if [ "${LOCKINGLIBDIR:0:1}" != "/" ]
|
|
then
|
|
echo "Prefix must be an absolute path name (starting with a /)"
|
|
exit 12
|
|
fi
|
|
|
|
if [ -n "$LOCKINGLIB" ] && [ ! -f "$LOCKINGLIBDIR/$LOCKINGLIB" ]
|
|
then
|
|
echo "$LOCKINGLIBDIR/$LOCKINGLIB does not exist, did you do a \"make install\" ?"
|
|
exit 11
|
|
fi
|
|
|
|
fi
|
|
|
|
if [ "$LOCKING_TYPE" = "1" ] && [ -n "$LOCKINGLIBDIR" -o -n "$LOCKINGLIB" ]; then
|
|
echo "Superfluous locking lib parameter, ignoring"
|
|
fi
|
|
}
|
|
|
|
umask 0077
|
|
|
|
parse_args "$@"
|
|
|
|
validate_args
|
|
|
|
|
|
SCRIPTFILE=/etc/lvm/.lvmconf-script.tmp
|
|
TMPFILE=/etc/lvm/.lvmconf-tmp.tmp
|
|
|
|
|
|
# Flags so we know which parts of the file we can replace and which need
|
|
# adding. These are return codes from grep, so zero means it IS present!
|
|
have_type=1
|
|
have_dir=1
|
|
have_library=1
|
|
have_use_lvmetad=1
|
|
have_global=1
|
|
|
|
grep -q '^[[:blank:]]*locking_type[[:blank:]]*=' $CONFIGFILE
|
|
have_type=$?
|
|
|
|
grep -q '^[[:blank:]]*library_dir[[:blank:]]*=' $CONFIGFILE
|
|
have_dir=$?
|
|
|
|
grep -q '^[[:blank:]]*locking_library[[:blank:]]*=' $CONFIGFILE
|
|
have_library=$?
|
|
|
|
grep -q '^[[:blank:]]*use_lvmetad[[:blank:]]*=' $CONFIGFILE
|
|
have_use_lvmetad=$?
|
|
|
|
# Those options are in section "global {" so we must have one if any are present.
|
|
if [ "$have_type" = "0" -o "$have_dir" = "0" -o "$have_library" = "0" -o "$have_use_lvmetad" = "0" ]
|
|
then
|
|
|
|
# See if we can find it...
|
|
grep -q '^[[:blank:]]*global[[:blank:]]*{' $CONFIGFILE
|
|
have_global=$?
|
|
|
|
if [ "$have_global" = "1" ]
|
|
then
|
|
echo "global keys but no 'global {' found, can't edit file"
|
|
exit 13
|
|
fi
|
|
fi
|
|
|
|
if [ "$LOCKING_TYPE" = "2" ] && [ -z "$LOCKINGLIBDIR" ] && [ "$have_dir" = "1" ]; then
|
|
echo "no library_dir specified in $CONFIGFILE"
|
|
exit 16
|
|
fi
|
|
|
|
# So if we don't have "global {" we need to create one and
|
|
# populate it
|
|
|
|
if [ "$have_global" = "1" ]
|
|
then
|
|
if [ -z "$LOCKING_TYPE" ]; then
|
|
LOCKING_TYPE=1
|
|
fi
|
|
if [ "$LOCKING_TYPE" = "3" ] || [ "$LOCKING_TYPE" = "2" ]; then
|
|
cat $CONFIGFILE - <<EOF > $TMPFILE
|
|
global {
|
|
# Enable locking for cluster LVM
|
|
locking_type = $LOCKING_TYPE
|
|
library_dir = "$LOCKINGLIBDIR"
|
|
# Disable lvmetad in cluster
|
|
use_lvmetad = 0
|
|
EOF
|
|
if [ $? != 0 ]
|
|
then
|
|
echo "failed to create temporary config file, $CONFIGFILE not updated"
|
|
exit 14
|
|
fi
|
|
if [ -n "$LOCKINGLIB" ]; then
|
|
cat - <<EOF >> $TMPFILE
|
|
locking_library = "$LOCKINGLIB"
|
|
EOF
|
|
if [ $? != 0 ]
|
|
then
|
|
echo "failed to create temporary config file, $CONFIGFILE not updated"
|
|
exit 16
|
|
fi
|
|
fi
|
|
cat - <<EOF >> $TMPFILE
|
|
}
|
|
EOF
|
|
fi # if we aren't setting cluster locking, we don't need to create a global section
|
|
|
|
if [ $? != 0 ]
|
|
then
|
|
echo "failed to create temporary config file, $CONFIGFILE not updated"
|
|
exit 17
|
|
fi
|
|
else
|
|
#
|
|
# We have a "global {" section, so add or replace the
|
|
# locking entries as appropriate
|
|
#
|
|
|
|
if [ -n "$LOCKING_TYPE" ]; then
|
|
if [ "$have_type" = "0" ]
|
|
then
|
|
SEDCMD=" s/^[[:blank:]]*locking_type[[:blank:]]*=.*/\ \ \ \ locking_type = $LOCKING_TYPE/g"
|
|
else
|
|
SEDCMD=" /global[[:blank:]]*{/a\ \ \ \ locking_type = $LOCKING_TYPE"
|
|
fi
|
|
fi
|
|
|
|
if [ -n "$LOCKINGLIBDIR" ]; then
|
|
if [ "$have_dir" = "0" ]
|
|
then
|
|
SEDCMD="${SEDCMD}\ns'^[[:blank:]]*library_dir[[:blank:]]*=.*'\ \ \ \ library_dir = \"$LOCKINGLIBDIR\"'g"
|
|
else
|
|
SEDCMD="${SEDCMD}\n/global[[:blank:]]*{/a\ \ \ \ library_dir = \"$LOCKINGLIBDIR\""
|
|
fi
|
|
fi
|
|
|
|
if [ -n "$LOCKINGLIB" ]; then
|
|
if [ "$have_library" = "0" ]
|
|
then
|
|
SEDCMD="${SEDCMD}\ns/^[[:blank:]]*locking_library[[:blank:]]*=.*/\ \ \ \ locking_library = \"$LOCKINGLIB\"/g"
|
|
else
|
|
SEDCMD="${SEDCMD}\n/global[[:blank:]]*{/a\ \ \ \ locking_library = \"$LOCKINGLIB\""
|
|
fi
|
|
fi
|
|
|
|
if [ "$have_use_lvmetad" = "0" ]
|
|
then
|
|
SEDCMD="${SEDCMD}\ns'^[[:blank:]]*use_lvmetad[[:blank:]]*=.*'\ \ \ \ use_lvmetad = $USE_LVMETAD'g"
|
|
else
|
|
SEDCMD="${SEDCMD}\n/global[[:blank:]]*{/a\ \ \ \ use_lvmetad = $USE_LVMETAD"
|
|
fi
|
|
|
|
echo -e $SEDCMD > $SCRIPTFILE
|
|
sed <$CONFIGFILE >$TMPFILE -f $SCRIPTFILE
|
|
if [ $? != 0 ]
|
|
then
|
|
echo "sed failed, $CONFIGFILE not updated"
|
|
exit 15
|
|
fi
|
|
fi
|
|
|
|
# Now we have a suitably editted config file in a temp place,
|
|
# backup the original and copy our new one into place.
|
|
|
|
cp $CONFIGFILE $CONFIGFILE.lvmconfold
|
|
if [ $? != 0 ]
|
|
then
|
|
echo "failed to backup old config file, $CONFIGFILE not updated"
|
|
exit 2
|
|
fi
|
|
|
|
cp $TMPFILE $CONFIGFILE
|
|
if [ $? != 0 ]
|
|
then
|
|
echo "failed to copy new config file into place, check $CONFIGFILE is still OK"
|
|
exit 3
|
|
fi
|
|
|
|
rm -f $SCRIPTFILE $TMPFILE
|
|
|
|
function set_service {
|
|
local type="$1"
|
|
local action="$2"
|
|
shift 2
|
|
|
|
if [ "$type" = "systemd" ]; then
|
|
if [ "$action" = "activate" ]; then
|
|
for i in $@; do
|
|
eval $($SYSTEMCTL_BIN show $i -p LoadState)
|
|
test "$LoadState" = "loaded" || continue
|
|
$SYSTEMCTL_BIN enable $i
|
|
if [ "$START_STOP_SERVICES" = "1" ]; then
|
|
$SYSTEMCTL_BIN start $i
|
|
fi
|
|
done
|
|
elif [ "$action" = "deactivate" ]; then
|
|
for i in $@; do
|
|
eval $($SYSTEMCTL_BIN show $i -p LoadState)
|
|
test "$LoadState" = "loaded" || continue
|
|
$SYSTEMCTL_BIN disable $i
|
|
if [ "$START_STOP_SERVICES" = "1" ]; then
|
|
$SYSTEMCTL_BIN stop $i
|
|
fi
|
|
done
|
|
fi
|
|
elif [ "$type" = "sysv" ]; then
|
|
if [ "$action" = "activate" ]; then
|
|
for i in $@; do
|
|
$CHKCONFIG_BIN --list $i > /dev/null || continue
|
|
$CHKCONFIG_BIN $i on
|
|
if [ "$START_STOP_SERVICES" = "1" ]; then
|
|
$SERVICE_BIN $i start
|
|
fi
|
|
done
|
|
elif [ "$action" = "deactivate" ]; then
|
|
for i in $@; do
|
|
$CHKCONFIG_BIN --list $i > /dev/null || continue
|
|
if [ "$START_STOP_SERVICES" = "1" ]; then
|
|
$SERVICE_BIN $i stop
|
|
fi
|
|
$CHKCONFIG_BIN $i off
|
|
done
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# Start/stop and enable/disable services if needed.
|
|
|
|
if [ "$HANDLE_SERVICES" == "1" ]; then
|
|
|
|
SYSTEMCTL_BIN=$(which systemctl 2>/dev/null)
|
|
CHKCONFIG_BIN=$(which chkconfig 2>/dev/null)
|
|
SERVICE_BIN=$(which service 2>/dev/null)
|
|
|
|
# Systemd services
|
|
if [ -n "$SYSTEMCTL_BIN" ]; then
|
|
if [ "$USE_LVMETAD" = "0" ]; then
|
|
set_service systemd deactivate lvm2-lvmetad.service lvm2-lvmetad.socket
|
|
else
|
|
set_service systemd activate lvm2-lvmetad.socket
|
|
fi
|
|
|
|
if [ "$LOCKING_TYPE" = "3" ]; then
|
|
set_service systemd activate lvm2-cluster-activation.service
|
|
if [ "$HANDLE_CMIRROR_SERVICE" ]; then
|
|
set_service activate lvm2-cmirrord.service
|
|
fi
|
|
else
|
|
set_service systemd deactivate lvm2-cluster-activation.service
|
|
if [ "$HANDLE_CMIRROR_SERVICE" ]; then
|
|
set_service systemd deactivate lvm2-cmirrord.service
|
|
fi
|
|
fi
|
|
|
|
# System V init scripts
|
|
elif [ -n "$SERVICE_BIN" -a -n "$CHKCONFIG_BIN" ]; then
|
|
if [ "$USE_LVMETAD" = "0" ]; then
|
|
set_service sysv deactivate lvm2-lvmetad
|
|
else
|
|
set_service sysv activate lvm2-lvmetad
|
|
fi
|
|
|
|
if [ "$LOCKING_TYPE" = "3" ]; then
|
|
set_service sysv activate clvmd
|
|
if [ "$HANDLE_MIRROR_SERVICE" = "1" ]; then
|
|
set_service sysv activate cmirrord
|
|
fi
|
|
else
|
|
set_service sysv deactivate clvmd
|
|
if [ "$HANDLE_MIRROR_SERVICE" = "1" ]; then
|
|
set_service sysv deactivate cmirrord
|
|
fi
|
|
fi
|
|
|
|
# None of the service tools found, error out
|
|
else
|
|
echo "Missing tools to handle services"
|
|
exit 20
|
|
fi
|
|
fi
|