| #!/sbin/openrc-run |
| # Copyright 1999-2016 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 | grep -q 'use_lvmetad=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 |
| 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" |
| # 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 |