174 lines
4.1 KiB
Plaintext
174 lines
4.1 KiB
Plaintext
#!/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
|