| #!/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 |