summaryrefslogtreecommitdiff
blob: fec87d0123f3ed33b9b830f7d8926dd63c1f46d5 (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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
commit 3cb750b249717b43cbfcde78b44b0e38a2a61dc2
Author: James Lee <jlee@thestaticvoid.com>
Date:   Sat Sep 19 22:00:36 2015 -0400

    zfs-import: Perform verbatim import using cache file
    
    This change modifies the import service to use the default cache file
    to perform a verbatim import of pools at boot.  This fixes code that
    searches all devices and imported all visible pools.
    
    Using the cache file is in keeping with the way ZFS has always worked,
    how Solaris, Illumos, FreeBSD, and systemd performs imports, and is how
    it is written in the man page (zpool(1M,8)):
    
        All pools  in  this  cache  are  automatically imported when the
        system boots.
    
    Importantly, the cache contains important information for importing
    multipath devices, and helps control which pools get imported in more
    dynamic environments like SANs, which may have thousands of visible
    and constantly changing pools, which the ZFS_POOL_EXCEPTIONS variable
    is not equipped to handle.  Verbatim imports prevent rogue pools from
    being automatically imported and mounted where they shouldn't be.
    
    The change also stops the service from exporting pools at shutdown.
    Exporting pools is only meant to be performed explicitly by the
    administrator of the system.
    
    The old behavior of searching and importing all visible pools is
    preserved and can be switched on by heeding the warning and toggling
    the ZPOOL_IMPORT_ALL_VISIBLE variable in /etc/default/zfs.
    
    Closes #3777
    Closes #3526

diff --git a/etc/init.d/zfs-import.in b/etc/init.d/zfs-import.in
index 5e21929..2258638 100755
--- a/etc/init.d/zfs-import.in
+++ b/etc/init.d/zfs-import.in
@@ -1,11 +1,10 @@
 #!@SHELL@
 #
-# zfs-import    This script will import/export zfs pools.
+# zfs-import    This script will import ZFS pools
 #
 # chkconfig:    2345 01 99
-# description:  This script will import/export zfs pools during system
-#               boot/shutdown.
-#               It is also responsible for all userspace zfs services.
+# description:  This script will perform a verbatim import of ZFS pools
+#               during system boot.
 # probe: true
 #
 ### BEGIN INIT INFO
@@ -17,7 +16,7 @@
 # X-Start-Before:    checkfs
 # X-Stop-After:      zfs-mount
 # Short-Description: Import ZFS pools
-# Description: Run the `zpool import` or `zpool export` commands.
+# Description: Run the `zpool import` command.
 ### END INIT INFO
 #
 # NOTE: Not having '$local_fs' on Required-Start but only on Required-Stop
@@ -43,6 +42,16 @@ do_depend()
 	keyword -lxc -openvz -prefix -vserver
 }
 
+# Use the zpool cache file to import pools
+do_verbatim_import()
+{
+	if [ -f "$ZPOOL_CACHE" ]
+	then
+		zfs_action "Importing ZFS pool(s)" \
+			"$ZPOOL" import -c "$ZPOOL_CACHE" -N -a
+	fi
+}
+
 # Support function to get a list of all pools, separated with ';'
 find_pools()
 {
@@ -60,8 +69,8 @@ find_pools()
 	echo "${pools%%;}" # Return without the last ';'.
 }
 
-# Import all pools
-do_import()
+# Find and import all visible pools, even exported ones
+do_import_all_visible()
 {
 	local already_imported available_pools pool npools
 	local exception dir ZPOOL_IMPORT_PATH RET=0 r=1
@@ -109,7 +118,7 @@ do_import()
 		fi
 	fi
 
-        # Filter out any exceptions...
+	# Filter out any exceptions...
 	if [ -n "$ZFS_POOL_EXCEPTIONS" ]
 	then
 		local found=""
@@ -249,41 +258,15 @@ do_import()
 	return "$RET"
 }
 
-# Export all pools
-do_export()
+do_import()
 {
-	local already_imported pool root_pool RET r
-	RET=0
-
-	root_pool=$(get_root_pool)
-
-	[ -n "$init" ] && zfs_log_begin_msg "Exporting ZFS pool(s)"
-
-	# Find list of already imported pools.
-	already_imported=$(find_pools "$ZPOOL" list -H -oname)
-
-	OLD_IFS="$IFS" ; IFS=";"
-	for pool in $already_imported; do
-		[ "$pool" = "$root_pool" ] && continue
-
-		if [ -z "$init" ]
-		then
-			# Interactive - one 'Importing ...' line per pool
-			zfs_log_begin_msg "Exporting ZFS pool $pool"
-		else
-			# Not interactive - a dot for each pool.
-			zfs_log_progress_msg "."
-		fi
-
-		"$ZPOOL" export "$pool"
-		r="$?" ; RET=$((RET + r))
-		[ -z "$init" ] && zfs_log_end_msg "$r"
-	done
-	IFS="$OLD_IFS"
-
-	[ -n "$init" ] && zfs_log_end_msg "$RET"
-
-	return "$RET"
+	if check_boolean "$ZPOOL_IMPORT_ALL_VISIBLE"
+	then
+		do_import_all_visible
+	else
+		# This is the default option
+		do_verbatim_import
+	fi
 }
 
 # Output the status and list of pools
@@ -323,14 +306,6 @@ do_start()
 	fi
 }
 
-do_stop()
-{
-	# Check to see if the module is even loaded.
-	check_module_loaded "zfs" || exit 0
-
-	do_export
-}
-
 # ----------------------------------------------------
 
 if [ ! -e /etc/gentoo-release ]
@@ -340,7 +315,7 @@ then
 			do_start
 			;;
 		stop)
-			do_stop
+			# no-op
 			;;
 		status)
 			do_status
@@ -350,7 +325,7 @@ then
 			;;
 		*)
 			[ -n "$1" ] && echo "Error: Unknown command $1."
-			echo "Usage: $0 {start|stop|status}"
+			echo "Usage: $0 {start|status}"
 			exit 3
 			;;
 	esac
@@ -360,6 +335,5 @@ else
 	# Create wrapper functions since Gentoo don't use the case part.
 	depend() { do_depend; }
 	start() { do_start; }
-	stop() { do_stop; }
 	status() { do_status; }
 fi
diff --git a/etc/init.d/zfs.in b/etc/init.d/zfs.in
index eabb7e4..d81ef22 100644
--- a/etc/init.d/zfs.in
+++ b/etc/init.d/zfs.in
@@ -16,6 +16,24 @@ ZFS_SHARE='yes'
 # Run `zfs unshare -a` during system stop?
 ZFS_UNSHARE='yes'
 
+# By default, a verbatim import of all pools is performed at boot based on the
+# contents of the default zpool cache file.  The contents of the cache are
+# managed automatically by the 'zpool import' and 'zpool export' commands.
+#
+# By setting this to 'yes', the system will instead search all devices for
+# pools and attempt to import them all at boot, even those that have been
+# exported.  Under this mode, the search path can be controlled by the
+# ZPOOL_IMPORT_PATH variable and a list of pools that should not be imported
+# can be listed in the ZFS_POOL_EXCEPTIONS variable.
+#
+# Note that importing all visible pools may include pools that you don't
+# expect, such as those on removable devices and SANs, and those pools may
+# proceed to mount themselves in places you do not want them to.  The results
+# can be unpredictable and possibly dangerous.  Only enable this option if you
+# understand this risk and have complete physical control over your system and
+# SAN to prevent the insertion of malicious pools.
+ZPOOL_IMPORT_ALL_VISIBLE='no'
+
 # Specify specific path(s) to look for device nodes and/or links for the
 # pool import(s). See zpool(8) for more information about this variable.
 # It supersedes the old USE_DISK_BY_ID which indicated that it would only
@@ -23,6 +41,18 @@ ZFS_UNSHARE='yes'
 # The old variable will still work in the code, but is deprecated.
 #ZPOOL_IMPORT_PATH="/dev/disk/by-vdev:/dev/disk/by-id"
 
+# List of pools that should NOT be imported at boot
+# when ZPOOL_IMPORT_ALL_VISIBLE is 'yes'.
+# This is a space separated list.
+#ZFS_POOL_EXCEPTIONS="test2"
+
+# List of pools that SHOULD be imported at boot by the initramfs
+# instead of trying to import all available pools.  If this is set
+# then ZFS_POOL_EXCEPTIONS is ignored.
+# Only applicable for Debian GNU/Linux {dkms,initramfs}.
+# This is a semi-colon separated list.
+#ZFS_POOL_IMPORT="pool1;pool2"
+
 # Should the datasets be mounted verbosely?
 # A mount counter will be used when mounting if set to 'yes'.
 VERBOSE_MOUNT='no'
@@ -97,17 +127,6 @@ ZFS_INITRD_POST_MODPROBE_SLEEP='0'
 # Example: If root FS is 'rpool/ROOT/rootfs', this would make sense.
 #ZFS_INITRD_ADDITIONAL_DATASETS="rpool/ROOT/usr rpool/ROOT/var"
 
-# List of pools that should NOT be imported at boot?
-# This is a space separated list.
-#ZFS_POOL_EXCEPTIONS="test2"
-
-# List of pools to import?
-# If this variable is set, there will be NO auto-import of ANY other
-# pool. In essence, there will be no auto detection of availible pools.
-# This is a semi-colon separated list.
-# Makes the variable ZFS_POOL_EXCEPTIONS above redundant (won't be checked).
-#ZFS_POOL_IMPORT="pool1;pool2"
-
 # Optional arguments for the ZFS Event Daemon (ZED).
 # See zed(8) for more information on available options.
 #ZED_ARGS="-M"