aboutsummaryrefslogtreecommitdiff
path: root/sys/contrib/openzfs/etc/init.d/zfs-mount.in
diff options
context:
space:
mode:
Diffstat (limited to 'sys/contrib/openzfs/etc/init.d/zfs-mount.in')
-rwxr-xr-xsys/contrib/openzfs/etc/init.d/zfs-mount.in227
1 files changed, 227 insertions, 0 deletions
diff --git a/sys/contrib/openzfs/etc/init.d/zfs-mount.in b/sys/contrib/openzfs/etc/init.d/zfs-mount.in
new file mode 100755
index 000000000000..9b400916f42e
--- /dev/null
+++ b/sys/contrib/openzfs/etc/init.d/zfs-mount.in
@@ -0,0 +1,227 @@
+#!@DEFAULT_INIT_SHELL@
+#
+# zfs-mount This script will mount/umount the zfs filesystems.
+#
+# chkconfig: 2345 06 99
+# description: This script will mount/umount the zfs filesystems during
+# system boot/shutdown. Configuration of which filesystems
+# should be mounted is handled by the zfs 'mountpoint' and
+# 'canmount' properties. See the zfs(8) man page for details.
+# It is also responsible for all userspace zfs services.
+# probe: true
+#
+### BEGIN INIT INFO
+# Provides: zfs-mount
+# Required-Start: $local_fs zfs-import
+# Required-Stop: $local_fs zfs-import
+# Default-Start: 2 3 4 5
+# Default-Stop: 0 1 6
+# X-Stop-After: zfs-zed
+# Short-Description: Mount ZFS filesystems and volumes
+# Description: Run the `zfs mount -a` or `zfs umount -a` commands.
+### END INIT INFO
+#
+# Released under the 2-clause BSD license.
+#
+# The original script that acted as a template for this script came from
+# the Debian GNU/Linux kFreeBSD ZFS packages (which did not include a
+# licensing stansa) in the commit dated Mar 24, 2011:
+# https://github.com/zfsonlinux/pkg-zfs/commit/80a3ae582b59c0250d7912ba794dca9e669e605a
+
+# Source the common init script
+. @sysconfdir@/zfs/zfs-functions
+
+# ----------------------------------------------------
+
+chkroot() {
+ while read line; do
+ set -- $line
+ if [ "$2" = "/" ]; then
+ return 0
+ fi
+ done < /proc/self/mounts
+
+ return 1
+}
+
+do_depend()
+{
+ # Try to allow people to mix and match fstab with ZFS in a way that makes sense.
+ if [ "$(mountinfo -s /)" = 'zfs' ]
+ then
+ before localmount
+ else
+ after localmount
+ fi
+
+ # bootmisc will log to /var which may be a different zfs than root.
+ before bootmisc logger
+
+ after zfs-import sysfs
+ use mtab
+ keyword -lxc -openvz -prefix -vserver
+}
+
+# Mount all datasets/filesystems
+do_mount()
+{
+ local verbose overlay i mntpt val
+
+ check_boolean "$VERBOSE_MOUNT" && verbose=v
+ check_boolean "$DO_OVERLAY_MOUNTS" && overlay=O
+
+ zfs_action "Mounting ZFS filesystem(s)" \
+ "$ZFS" mount -a$verbose$overlay "$MOUNT_EXTRA_OPTIONS"
+
+ # Require each volume/filesystem to have 'noauto' and no fsck
+ # option. This shouldn't really be necessary, as long as one
+ # can get zfs-import to run sufficiently early on in the boot
+ # process - before local mounts. This is just here in case/if
+ # this isn't possible.
+ check_boolean "$VERBOSE_MOUNT" && \
+ zfs_log_begin_msg "Mounting volumes and filesystems registered in fstab"
+
+ read_mtab "^/dev/(zd|zvol)"
+ read_fstab "^/dev/(zd|zvol)"
+ i=0; var=$(eval echo FSTAB_$i)
+ while [ -n "$(eval echo "$""$var")" ]
+ do
+ mntpt=$(eval echo "$""$var")
+ dev=$(eval echo "$"FSTAB_dev_$i)
+ if ! in_mtab "$mntpt" && ! is_mounted "$mntpt" && [ -e "$dev" ]
+ then
+ check_boolean "$VERBOSE_MOUNT" && \
+ zfs_log_progress_msg "$mntpt "
+ fsck "$dev" && mount "$mntpt"
+ fi
+
+ i=$((i + 1))
+ var=$(eval echo FSTAB_$i)
+ done
+
+ read_mtab "[[:space:]]zfs[[:space:]]"
+ read_fstab "[[:space:]]zfs[[:space:]]"
+ i=0; var=$(eval echo FSTAB_$i)
+ while [ -n "$(eval echo "$""$var")" ]
+ do
+ mntpt=$(eval echo "$""$var")
+ if ! in_mtab "$mntpt" && ! is_mounted "$mntpt"
+ then
+ check_boolean "$VERBOSE_MOUNT" && \
+ zfs_log_progress_msg "$mntpt "
+ mount "$mntpt"
+ fi
+
+ i=$((i + 1))
+ var=$(eval echo FSTAB_$i)
+ done
+ check_boolean "$VERBOSE_MOUNT" && zfs_log_end_msg 0
+
+ return 0
+}
+
+# Unmount all filesystems
+do_unmount()
+{
+ local i var mntpt
+
+ # This shouldn't really be necessary, as long as one can get
+ # zfs-import to run sufficiently late in the shutdown/reboot process
+ # - after unmounting local filesystems. This is just here in case/if
+ # this isn't possible.
+ zfs_action "Unmounting ZFS filesystems" "$ZFS" unmount -a
+
+ check_boolean "$VERBOSE_MOUNT" && \
+ zfs_log_begin_msg "Unmounting volumes and filesystems registered in fstab"
+
+ read_mtab "^/dev/(zd|zvol)"
+ read_fstab "^/dev/(zd|zvol)"
+ i=0; var=$(eval echo FSTAB_$i)
+ while [ -n "$(eval echo "$""$var")" ]
+ do
+ mntpt=$(eval echo "$""$var")
+ dev=$(eval echo "$"FSTAB_dev_$i)
+ if in_mtab "$mntpt"
+ then
+ check_boolean "$VERBOSE_MOUNT" && \
+ zfs_log_progress_msg "$mntpt "
+ umount "$mntpt"
+ fi
+
+ i=$((i + 1))
+ var=$(eval echo FSTAB_$i)
+ done
+
+ read_mtab "[[:space:]]zfs[[:space:]]"
+ read_fstab "[[:space:]]zfs[[:space:]]"
+ i=0; var=$(eval echo FSTAB_$i)
+ while [ -n "$(eval echo "$""$var")" ]
+ do
+ mntpt=$(eval echo "$""$var")
+ if in_mtab "$mntpt"; then
+ check_boolean "$VERBOSE_MOUNT" && \
+ zfs_log_progress_msg "$mntpt "
+ umount "$mntpt"
+ fi
+
+ i=$((i + 1))
+ var=$(eval echo FSTAB_$i)
+ done
+ check_boolean "$VERBOSE_MOUNT" && zfs_log_end_msg 0
+
+ return 0
+}
+
+do_start()
+{
+ check_boolean "$ZFS_MOUNT" || exit 0
+
+ check_module_loaded "zfs" || exit 0
+
+ # Ensure / exists in /proc/self/mounts.
+ # This should be handled by rc.sysinit but lets be paranoid.
+ if ! chkroot
+ then
+ mount -f /
+ fi
+
+ do_mount
+}
+
+do_stop()
+{
+ check_boolean "$ZFS_UNMOUNT" || exit 0
+
+ check_module_loaded "zfs" || exit 0
+
+ do_unmount
+}
+
+# ----------------------------------------------------
+
+if [ ! -e /sbin/openrc-run ]
+then
+ case "$1" in
+ start)
+ do_start
+ ;;
+ stop)
+ do_stop
+ ;;
+ force-reload|condrestart|reload|restart|status)
+ # no-op
+ ;;
+ *)
+ [ -n "$1" ] && echo "Error: Unknown command $1."
+ echo "Usage: $0 {start|stop}"
+ exit 3
+ ;;
+ esac
+
+ exit $?
+else
+ # Create wrapper functions since Gentoo don't use the case part.
+ depend() { do_depend; }
+ start() { do_start; }
+ stop() { do_stop; }
+fi