diff --git a/WHATS_NEW b/WHATS_NEW index b67635ce3..9928291aa 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,7 @@ Version 2.02.119 - ================================== + Add --services, --mirrorservice and --startstopservices option to lvmconf. + Use proper default value of global/use_lvmetad when processing lvmconf script. Respect allocation/cling_tag_list during intial contiguous allocation. Add A_PARTITION_BY_TAGS set when allocated areas should not share tags. Set correct vgid when updating cache when writing PV metadata. diff --git a/man/lvmconf.8.in b/man/lvmconf.8.in index bfd539a70..de86a2de1 100644 --- a/man/lvmconf.8.in +++ b/man/lvmconf.8.in @@ -6,12 +6,17 @@ lvmconf \(em LVM configuration modifier .B lvmconf .RB [ \-\-disable-cluster ] .RB [ \-\-enable-cluster ] +.RB [ \-\---enable-halvm ] +.RB [ \-\---disable-halvm ] .RB [ \-\-file .RI < configfile >] .RB [ \-\-lockinglib .RI < lib >] .RB [ \-\-lockinglibdir .RI < dir >] +.RB [ \-\-services ] +.RB [ \-\-mirrorservice ] +.RB [ \-\-startstopservices ] .SH "DESCRIPTION" lvmconf is a script that modifies the locking configuration in @@ -27,6 +32,14 @@ lvmetad use to its default. Set \fBlocking_type\fR to the default clustered type on this system. Also disable lvmetad use as it is not yet supported in clustered environment. .TP +.BR \-\-disable-halvm +Set \fBlocking_type\fR to the default non-clustered type. Also reset +lvmetad use to its default. +.TP +.BR \-\-enable-halvm +Set \fBlocking_type\fR suitable for HA LVM use. +Also disable lvmetad use as it is not yet supported in HA LVM environment. +.TP .BR \-\-file " <" \fIconfigfile > Apply the changes to \fIconfigfile\fP instead of the default \fI#DEFAULT_SYS_DIR#/lvm.conf\fP. @@ -35,6 +48,17 @@ Apply the changes to \fIconfigfile\fP instead of the default Set external \fBlocking_library\fR locking library to load if an external locking type is used. .TP .BR \-\-lockinglibdir " <" \fIdir > +.TP +.BR \-\-services +In addition to setting the lvm configuration, also enable or disable related Systemd or SysV +clvmd and lvmetad services. +.TP +.BR \-\-mirrorservice +Also enable or disable optional cmirrord service when handling services (applicable only with \-\-services). +.TP +.BR \-\-startstopservices +In addition to enabling or disabling related services, start or stop them immediately +(applicable only with \-\-services). .SH FILES .I #DEFAULT_SYS_DIR#/lvm.conf diff --git a/scripts/lvmconf.sh b/scripts/lvmconf.sh index bfe518e82..6c2a16701 100644 --- a/scripts/lvmconf.sh +++ b/scripts/lvmconf.sh @@ -16,7 +16,20 @@ # Edit an lvm.conf file to adjust various properties # -DEFAULT_USE_LVMETAD=0 +# 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 { @@ -25,13 +38,25 @@ function usage echo "Commands:" echo "Enable clvm: --enable-cluster [--lockinglibdir ] [--lockinglib ]" echo "Disable clvm: --disable-cluster" + echo "Enable halvm: --enable-halvm" + echo "Disable halvm: --disable-halvm" echo "Set locking library: --lockinglibdir [--lockinglib ]" echo "" echo "Global options:" echo "Config file location: --file " + 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 { @@ -40,13 +65,27 @@ function parse_args --enable-cluster) LOCKING_TYPE=3 USE_LVMETAD=0 + HANDLE_CLUSTER=1 shift ;; --disable-cluster) LOCKING_TYPE=1 - USE_LVMETAD=$DEFAULT_USE_LVMETAD + 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 @@ -55,6 +94,7 @@ function parse_args usage exit 1 fi + HANDLE_CLUSTER=1 ;; --lockinglib) if [ -n "$2" ]; then @@ -64,6 +104,7 @@ function parse_args usage exit 1 fi + HANDLE_CLUSTER=1 ;; --file) if [ -n "$2" ]; then @@ -74,6 +115,18 @@ function parse_args exit 1 fi ;; + --services) + HANDLE_SERVICES=1 + shift + ;; + --mirrorservice) + HANDLE_MIRROR_SERVICE=1 + shift + ;; + --startstopservices) + START_STOP_SERVICES=1 + shift + ;; *) usage exit 1 @@ -91,6 +144,22 @@ function validate_args 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 @@ -277,3 +346,104 @@ if [ $? != 0 ] 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