123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- #!/sbin/openrc-run
- # Copyright 1999-2017 Gentoo Foundation
- # 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}"
- }
- _need_lvmetad()
- {
- local lvm_path="$(_get_lvm_path)"
- [ ! -x "${lvm_path}" ] && return 1
- ${lvm_path} dumpconfig global 2>/dev/null | grep -q 'use_lvmetad=1'
- }
- _need_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 _need=
- if service_started; then
- _need=$(service_get_value need)
- else
- if _need_lvmetad; then
- _need="${_need} lvmetad"
- fi
- if _need_lvmlockd; then
- _need="${_need} lvmlockd"
- fi
- fi
- need sysfs ${_need}
- }
- 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)"
- for lvm_path in /bin/lvm /sbin/lvm ; do
- [ -x "$lvm_path" ] && break
- done
- if [ ! -x "$lvm_path" ]; then
- eerror "Cannot find lvm binary in /sbin or /bin!"
- return 1
- fi
- if [ -z "${CDBOOT}" ] ; then
- if [ -e /proc/modules ] && ! dm_in_proc ; then
- modprobe dm-mod 2>/dev/null
- fi
- if [ -d /proc/lvm ] || dm_in_proc ; then
- ebegin "Setting up the Logical Volume Manager"
- #still echo stderr for debugging
- lvm_commands="#! ${lvm_path} --config '${config}'\n"
- # Extra PV find pass because some devices might not have been available until very recently
- lvm_commands="${lvm_commands}pvscan\n"
- # Now make the nodes
- lvm_commands="${lvm_commands}vgscan --mknodes\n"
- # And turn them on!
- lvm_commands="${lvm_commands}vgchange --sysinit -a ly\n"
- if _need_lvmlockd; then
- # Start lockd VGs as required
- lvm_commands="${lvm_commands}vgchange --lock-start --lock-opt auto\n"
- fi
- # Order of this is important, have to work around dash and LVM readline
- printf "%b\n" "${lvm_commands}" | $lvm_path /proc/self/fd/0 --config "${config}" >/dev/null
- eend $? "Failed to setup the LVM"
- fi
- fi
- }
- start_post()
- {
- # Save if we needed lvmetad
- if _need_lvmetad; then
- service_set_value need lvmetad
- fi
- }
- stop() {
- for lvm_path in /bin/lvm /sbin/lvm ; do
- [ -x "$lvm_path" ] && break
- done
- if [ ! -x "$lvm_path" ]; then
- eerror "Cannot find lvm binary in /sbin or /bin!"
- return 1
- fi
- # Stop LVM2
- if [ -x /sbin/vgs ] && \
- [ -x /sbin/vgchange ] && \
- [ -x /sbin/lvchange ] && \
- [ -f /etc/lvmtab -o -d /etc/lvm ] && \
- [ -d /proc/lvm -o "`grep device-mapper /proc/misc 2>/dev/null`" ]
- then
- einfo "Shutting down the Logical Volume Manager"
- VGS=$($lvm_path vgs --config "${config}" -o vg_name --noheadings --nosuffix --rows 2> /dev/null)
- if [ "$VGS" ]
- then
- ebegin " Shutting Down LVs & VGs"
- #still echo stderr for debugging
- lvm_commands="#! ${lvm_path} --config '${config}'\n"
- # Extra PV find pass because some devices might not have been available until very recently
- lvm_commands="${lvm_commands}lvchange --sysinit -a ln ${VGS}\n"
- # Now make the nodes
- lvm_commands="${lvm_commands}vgchange --sysinit -a ln ${VGS}\n"
- # Order of this is important, have to work around dash and LVM readline
- printf "%b\n" "${lvm_commands}" | $lvm_path /proc/self/fd/0 --config "${config}" >/dev/null
- eend $? "Failed (possibly some LVs still needed for /usr or root)"
- fi
- einfo "Finished shutting down the Logical Volume Manager"
- return 0
- fi
- }
- # vim:ts=4
|