#!/sbin/openrc-run # Copyright 1999-2020 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 _get_lvm_path() { local lvm_path= for lvm_path in /bin/lvm /sbin/lvm ; do [ -x "${lvm_path}" ] && break done echo "${lvm_path}" } _use_lvmetad() { local lvm_path="$(_get_lvm_path)" [ ! -x "${lvm_path}" ] && return 1 ${lvm_path} dumpconfig global 2>/dev/null | grep -q 'use_lvmetad=1' } _use_lvmlockd() { local lvm_path="$(_get_lvm_path)" [ ! -x "${lvm_path}" ] && return 1 ${lvm_path} dumpconfig global 2>/dev/null | grep -q 'use_lvmlockd=1' } depend() { before checkfs fsck after modules device-mapper # We may want lvmetad based on the configuration. If we added lvmetad # support while lvm2 is running then we aren't dependent on it. For the # more common case, if its disabled in the config we aren't dependent # on it. config /etc/lvm/lvm.conf local _want= if service_started ; then _want=$(service_get_value want) else if _use_lvmetad ; then _want="${_want} lvmetad" fi if _use_lvmlockd ; then _want="${_want} lvmlockd" fi fi # Make sure you review /etc/conf.d/lvm as well! # Depending on your system, it might also introduce udev & mdraid need sysfs if [ -n "${_want}" ] ; then want ${_want} fi } config='global { locking_dir = "/run/lock/lvm" }' dm_in_proc() { local retval=0 for x in devices misc ; do grep -qs 'device-mapper' /proc/${x} retval=$((${retval} + $?)) done return ${retval} } start() { # LVM support for /usr, /home, /opt .... # This should be done *before* checking local # volumes, or they never get checked. # NOTE: Add needed modules for LVM or RAID, etc # to /etc/modules.autoload if needed lvm_path="$(_get_lvm_path)" if [ -z "${lvm_path}" ] ; then eerror "Failed to find lvm binary in /bin or /sbin!" return 1 fi if [ -z "${CDBOOT}" ] ; then if [ -e /proc/modules ] && ! dm_in_proc ; then ebegin "Trying to load dm-mod module" modprobe dm-mod 2>/dev/null eend $? fi if [ -d /proc/lvm ] || dm_in_proc ; then local has_errors=0 verbose_command yesno "${rc_verbose}" && verbose_command=" -v" ebegin "Starting the Logical Volume Manager" if _use_lvmetad ; then # Extra PV find pass because some devices might not have been available until very recently ${lvm_path} pvscan${verbose_command} --config "${config}" --cache [ $? -ne 0 ] && has_errors=1 fi # Now make the nodes ${lvm_path} vgscan${verbose_command} --config "${config}" --mknodes [ $? -ne 0 ] && has_errors=1 # Enable all VGs ${lvm_path} vgchange${verbose_command} --config "${config}" --sysinit --activate y [ $? -ne 0 ] && has_errors=1 if _use_lvmlockd ; then # Start lockd VGs as required ${lvm_path} vgchange${verbose_command} --config "${config}" --lock-start --lock-opt auto [ $? -ne 0 ] && has_errors=1 fi eend ${has_errors} "Failed to start the Logical Volume Manager" fi fi } start_post() { local _want= if _use_lvmetad ; then _want="${_want} lvmetad" fi if _use_lvmlockd ; then _want="${_want} lvmlockd" fi service_set_value want "${_want}" } stop() { lvm_path="$(_get_lvm_path)" if [ -z "${lvm_path}" ] ; then eerror "Failed to find lvm binary in /bin or /sbin!" return 1 fi # Stop LVM2 if [ -f /etc/lvmtab -o -d /etc/lvm ] \ && [ -d /proc/lvm -o "$(grep device-mapper /proc/misc 2>/dev/null)" ] then local VGS=$($lvm_path vgs --config "${config}" -o vg_name --noheadings --nosuffix --rows 2> /dev/null) if [ -z "${VGS}" ] ; then # nothing to do for us return 0 fi local has_errors=0 verbose_command eend_cmd="eend" yesno "${rc_verbose}" && verbose_command=" -v" local msg="Failed to stop Logical Volume Manager" if [ "${RC_RUNLEVEL}" = shutdown ] ; then # failures on shutdown are non-fatal eend_cmd="ewend" msg="${msg} (possibly some LVs still needed for /usr or root)" fi ebegin "Stopping the Logical Volume Manager" ${lvm_path} vgchange${verbose_command} --config "${config}" --sysinit --activate n [ $? -ne 0 ] && has_errors=1 ${eend_cmd} ${has_errors} "${msg}" fi # at this point make sure we always exit without indicating an error return 0 } # vim:ts=4