aboutsummaryrefslogtreecommitdiff
blob: d0d9e318c56bcf1a667c413265e3c821e9f5dbea (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#!/sbin/runscript
# Copyright 1999-2013 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$

depend() {
	use dmeventd
	before checkfs fsck
	after dmeventd modules device-mapper
}

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
	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
}

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 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\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"
        fi

	einfo "Finished Shutting down the Logical Volume Manager"
fi
}

# vim:ts=4