123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257 |
- 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"
|