You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gentoo-overlay/sys-fs/lvm2/files/lvm.rc-2.02.187

174 lines
4.1 KiB

#!/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 use 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 _use=
if service_started ; then
_use=$(service_get_value use)
else
if _use_lvmetad ; then
_use="${_use} lvmetad"
fi
if _use_lvmlockd ; then
_use="${_use} 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 "${_use}" ] ; then
use ${_use}
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 _use=
if _use_lvmetad ; then
_use="${_use} lvmetad"
fi
if _use_lvmlockd ; then
_use="${_use} lvmlockd"
fi
service_set_value use "${_use}"
}
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