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